- 博客(19)
- 资源 (1)
- 收藏
- 关注
原创 回调函数引发的自省
每次看到回调函数我都会纠结一下,因为我不会。尽管每次都会重新学习一遍,但是从来没用过,过几天就会忘记。经常看到别人说回调函数好用,今天就再次从网上学习了一遍回调函数。看完之后,觉得回调函数...就这?附段学习网站的代码:#include<stdio.h>int Callback_1() // Callback Function 1{ printf("Hello, this is Callback_1 "); return 0;}int Callback_2()
2021-02-19 18:35:23 316 1
原创 单片机死机,按键复位失效,看门狗失效,必须断电重启
最近在进行硬件程序老化测试的时候,发现程序偶尔会复位,运行几天后,还会出现死机的情况。尝试按下复位按键,程序在运行初始打印一行开机log后继续死机。断电重启后,程序重新正常运行。一开始判断是硬件“死锁”问题,造成这种情况的主要原因是单片机的某些引脚有强干扰侵入,应采取限流及各种抗干扰措施。但是考虑到按键复位虽然会死机,但是还是打印了一行开机log,进而判断也有可能是程序问题。因为我是使用的freeRTOS操作系统,当初由于任务分配的堆栈较小,也曾导致程序无法运行(程序一开始运行一小段代码后无法运行,
2021-01-26 14:01:31 6451 4
原创 无名管道
无名管道(pipe):无名管道是在内核中提供的一块共享空间, 供两个进程进行读写。管道是单双共的,同时读写数据就会出错,具有固定的读端和写端。只能用于亲缘进程。以下这种方法一般用于父子进程:pipe执行成功后会在内核中创建一个管道空间,并将两个文件描述符返回给进程。注意fd[0] 固定读、 fd[1] 固定写。int fd[2];if(pipe(fd) == -1){ perror("pipe failed"); return...
2021-01-12 14:42:47 1006
原创 4G模块使用TCP实现MQTT协议
最近做项目使用模块的MQTT功能,但是由于MQTT没有透传模式,发送接收使用AT指令太频繁的话容易出错。今天在技术群里偶然听说了可以使用TCP模式,自己再在TCP的基础上封装一层MQTT数据协议,想了一下确实可行。在网上找了一下,发现一段代码如下:int strlen(char *str){ int len = 0; while (*str != '\0') { len++; str++; } return len;} /
2020-12-22 14:13:29 4496 6
原创 基于onvif协议的嵌入式设备(摄像头)开发(客户端)
一、概述 公司准备开发一个电力系统的云台微拍设备,具备拍照、录像、实时语言、实时视频、存储并上传服务器等功能。由于我之前不是做的电力行业,对视频类的设备完全不懂,所以前期的项目调研花了很多时间,今天抽个时间来拼凑记录一下前期的调研结果,本篇文章旨在告诉新手一个研发方向。二、背景 IPC我在网上搜了很多家,知名度较高的有海康,大华等。我挑选的是海康的...
2020-12-21 14:17:29 1717
转载 Modbus TCP协议学习笔记
Modbus TCP协议学习笔记转载于:https://blog.csdn.net/iknow_nothing/article/details/842929141 简介modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准。1996年施耐德公司推出基于以太网TCP/IP的modbus协议:modbusTCP。Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。标准的Modbus协议物理层接口有RS232、RS422、RS485.
2020-12-18 17:27:12 798 1
原创 在立创商城上快速制作PCB原理图库
以可调降压电源芯片TPS62130为例:1.打开立创商城,搜索元器件2.点击“下载文件”3.出现下图,点击“立即使用”4.保存原理图文件5.保存完,导出6.打开导出文件7.生成原理图库8.保存9.导入AD库中10.安装完毕...
2020-12-17 13:39:10 4982
原创 linux动态库的制作与编译
在linux中,当你想调用另一个xxx.c文件中的函数时,包含头文件可能并不能达到预期的效果。这时就需要自己制作一个动态库,在编译的时候链接这个动态库,即可完成编译。方法如下:①创建一个xxx.c文件,将想要调用的子函数放进去(不可添加main函数)②将xxx.c文件编译成动态库:$(CC) -shared -fpic -o libxxxxx.so xxx.c (CC根据当前环境选择gcc或者是交叉编译)③把这个.so文件拷贝到一个指定的绝对路径的文件夹中编译方法:在编译时,加.
2020-12-17 13:18:16 245
原创 4G模块的GPS定位差距过大
使用SIMCOM7600CE模块进行GPS定位的时候,得到的坐标使用百度地图/高德地图进行定位,发现实际位置与定位相差几公里甚至十几公里。原因:OpenLuat 的所有 GNSS 模块 均使用国际标准WGS-84坐标系,所以开发者在国内常见地图定位时,会发现与实际情况有几十米的误差。这并非模块问题, 而是国内地图采用了非标坐标系所致。国内常见地图如高德地图使用GCJ-02坐标系, 百度地图使用BD-09坐标系,故此开发者需要对模块输出的经纬度进行加偏处理,才能在国内的地图上实现精确定位。...
2020-12-08 10:34:55 2398
原创 freeRTOS出现任务卡死的情况。
最近在做一个产品二代升级的项目,代码是上一任工程师留下的,很多BUG,而且融合了HAL库和LL库,以及github上下载的GSM源码,很不好用。我这边是将2G模块换成了4G,且添加了单独的BLE模块。因此只在源码的基础上,去除2G和BLE代码部分,添加新的4G和BLE代码。整个freeRTOS工程项目创建了4个task任务。我是先修改了BLE任务,修改完毕后运行正常;然后一步一步添加新的4G任务代码。发现只添加4G初始化代码,4个任务都正常,但是添加业务功能代码的时候,4个任务都卡死了(一运行就
2020-12-03 11:18:03 14598 5
原创 STM32单片机串口输出乱码
近期在调试板子的时候,发现串口打印数据是乱码。查看板子发现晶振是8M,但是固件库使用的外部晶振默认是25M。修改HSE_VALUE为8M后,串口功能正常。
2020-11-24 13:57:40 635
转载 for(;;)和while(true)的区别
总结 :for(;;) 比 while(true) 好为啥:如下(底层完全不同)“死循环”有两种写法:for(;;)和while(true),两者有啥区别,为啥源码中多数是for( ; ; )这种形式的, 编译前 编译后 while (1); mov eax,1 test eax,eax je foo+23h j...
2020-10-26 10:45:32 277
原创 linux内核启动分析
参考阿尔法imx6ul开发板,作出整理。1.首先分析 Linux 内核的连接脚本文件 arch/arm/kernel/vmlinux.lds,通过链接脚本可以找到 Linux 内核的第一行程序是从哪里执行的第 493 行的 ENTRY 指明了了 Linux 内核入口, 入口为 stext,stext 定义在文件arch/arm/kernel/head.S 中 , 因 此 要 分 析 Linux 内 核 的 启 动 流 程 , 就 得 先 从 文 件arch/arm/kernel/hea.
2020-10-23 14:18:01 246
原创 C语言:各种数据类型转换函数
#include <string.h>#include <stdio.h>#include <stdlib.h>/** tool_utils.c** Created on: 2016-2-2* Author: user*//******************************************************************************** 函数名 : strnicmp* 描..
2020-10-21 11:25:55 1698
原创 STM32F407(ucosII)利用4G模块进行IAP远程升级
一.硬件资源STM32F407VET6 flash:512K SIMCOM7600CE模块(MQTT)二.软件情况工程代码分两个来做,一个是BootLoader工程代码,一个是APP应用工程代码。注意对flash进行分区,这里我分4个区域,bootloader区、APP1区(运行的程序)、APP2区(存储待更新的程序)、FLAG区(标志位+待更新程序字节数)数据。但是注意这4部分数据必须在不同的扇区,不能有两部分数据处于同一扇区,因为写地址如果非 0XFF,那么会先擦除整个扇区且不保存扇区.
2020-10-13 17:28:55 3870 2
原创 freeRTOS操作系统任务调度方式
1.由于ucosii是按优先级来执行的,假如某个任务优先级比较低,而前面任务比较多,那么这个任务是否会存在永远得不到执行的可能?答:有可能 所以写代码要写好点。高优先级一定要在合适的时候让出CPU2.ucos中任务通过调用延时函数释放CPU使用权,当一个函数调用延时函数以后 释放了CPU,CPU开始执行其他任务,这个时候这个正在延时的函数延时时间还会走动吗?答:操作系统的延时函数都是挂在系统定时服务上的,通过CPU的定时中断实现无间断的计时。3.在某个任务执行的...
2020-08-04 18:20:41 1547
原创 ubuntu登录输入密码后无法进入系统,重新返回输入密码界面(已解决)
修改/etc/profile时,由于未知问题导致无法使用ls等命令,重启后输入密码无法进入Ubuntu系统,反复回到输入密码界面。解决方法:1. 按下Ctrl+Alt+F1 输入用户名+密码2. 输入:export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin(恢复指令)3.输入:修改/etc/profile,把之前添加的给删掉4.reboot重启系统...
2020-07-13 16:46:20 2661 3
原创 串口突然接收不到数据:ORE:过载错误 (Overrun error)
最近在使用串口DMA接收4G模块的AT指令回复时,一开始还能够接收到数据,后来运行到某个AT指令发送的时候,后面就接收不到数据了。进入内部的状态寄存器查看,发现接收数据过程中出现了错误:ORE:过载错误。 当数据接收区或者FIFO区有数据或者满时,又有新数据进来,会导致发生溢出错误,一旦发生溢出错误,RX 移位寄存区虽然能有新数据不断的覆盖,但是数据不会到达RXR或FIFO(现象是:RXNE在ORE置位时不会被置位),导致程序中不能读到新的数据。只有通过ICR清除ORE才能...
2020-05-29 16:51:08 7283
原创 简单的字符驱动初始化
1.申请设备号:驱动,首先必须得有设备号.设备号由主设备号和从设备号组成。dev_t devno; //32位的整数 dev_t () 这是一个unsigned int 是一个32位的无符号整型devno = MKDEV(major, minor);//MKDEV(major,minor);它做的事:major31~20 主设备号,用
2017-12-01 21:37:35 363
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人