软件
文章平均质量分 58
jim0506
这个作者很懒,什么都没留下…
展开
-
聊聊内存那些事(基于单片机系统)
为什么Rom中还要有RW,因为掉电后RAM中所有的数据都丢失了,每次上电RAM中的数据是被程序赋值的,每次这些固定的值就是存储在ROM中的,为什么不包含ZI段呢,是因为ZI数据都是0,没必要包含,只要查询运行之前将ZI数据所在的区域一律清零即可。当释放其中一个奇数块后,内存就可以达到需要分配的连续块大小了,所以分配的空间使用了p[2]、 p[3]、p[4]的空间。函数的参数是需要分配的空间字节大小,返回是一个void*类型的指针,该指针指向分配空间的首地址,void*类型指针可以转换为任意的其它类型指针。原创 2023-03-06 15:10:02 · 2350 阅读 · 1 评论 -
C语言枚举 变量自动修改为0的问题
有时候遇到一个奇怪的问题,C语言枚举变量自动修改为0,解决办法:枚举定义变量的时候初始化一下,就可以了。原创 2023-03-03 09:17:07 · 232 阅读 · 0 评论 -
大数组导致程序卡死
考虑在VC的Project setting 的link选项卡中把栈开大一些(Windows中默认是4M),相应的如果在keil中将栈设置大些也可以解决该问题。将数组变量声明成全局变量或者static,这两种变量不压栈,想开多大都可以。原创 2023-02-27 09:38:10 · 496 阅读 · 0 评论 -
C语言 匿名联合体和匿名结构体
尤其是多层继承时,A结构体继承与B结构体、B结构体又继承C结构体…最后嵌入式开发常见的几个C编译器比如IAR MDK GCC等都是支持的匿名联合体和结构体的,如果不支持可以粘贴下面的代码到自己的系统头文件中,就可以让你的匿名代码在意思几个环境下获得支持。如上所示,如果已经通过 datagram.data 接收到数据,想要从数据中提取传感器x轴数据,则只要通过 datagram.packet.x 就可以获取x轴数据。匿名联合体和匿名结构体顾名思义,就是没有名字的联合体和结构体,没有名字哪怎么用?原创 2023-02-02 14:42:16 · 2090 阅读 · 0 评论 -
内存对齐 #pragma pack()
pragma pack(n) //设置编辑器按照n个字节对齐,n可以取值1,2,4,8,16。#pragma pack(push) //将当前的对齐字节数压入栈顶,不改变对齐字节数。#pragma pack(push,n) //将当前的对齐字节数压入栈顶,并按照n字节对齐。#pragma pack(pop) //弹出栈顶对齐字节数,不改变对齐字节数。#pragma pack(pop,n) //弹出栈顶并直接丢弃,按照n字节对齐。这条指令主要用作改变。原创 2023-01-17 16:06:26 · 639 阅读 · 0 评论 -
STM32WB55 蓝牙OTA升级
1、擦除flash时容易造成蓝牙重启。2、如果选中下图红框,会导致死机。原创 2023-01-17 09:24:29 · 606 阅读 · 0 评论 -
hex 与ASCII 、字符串相互转换
例如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}例如:{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} --> "C8329BFD0E01"例如:str = +002321N ->hex = 2b3030323332314e。例如:hex = 2b3030323332314e ->str = +002321N。数字转化为hex十六进制的字符串。字符串转为hex(字符串形式)hex字符串转为字符串。原创 2023-01-17 09:21:36 · 7365 阅读 · 0 评论 -
ASCII码,字符,字符串三者之间的关系
从上面的编码过程 我们就可以看出来,一个个储存过于麻烦,因此我们就可以用字符串进行存储 ,但是在c语言中没有字符串数据类型 ( string ),因此声明一个。从上面可以看出,上述的数据类型都可以使用,但是通常我们都用 char 来存储,因为他占用的内存大小刚好合适,不会浪费内存。存单个字符时,字符占用1个字节,字符串占用两个字节,因为字符串总是以 '\0' 结尾,且\0 也占用一个内存空间。在使用sprintf 函数,在转换字符串时,如果遇到0时,会自动认为是结束标志,0以后的内容不会被添加进来。原创 2023-01-17 16:00:56 · 4094 阅读 · 0 评论 -
C语言调试中出现的一些莫名其妙的问题
定义一个全局变量static uint8_t simulation_value=0;,并附初值,但是其他地方有修改++,但是在进行其他操作时,该变量会变成并不是预期的值。当在定义时static uint8_t simulation_value。定义一个全局变量service_port,并附初值,在使用时总是莫名奇妙的变化成另一个值,其他地方没有任何的修改,原因没找到,但是在定义前加上const关键字修饰即可解决该问题。原创 2023-01-09 15:34:26 · 632 阅读 · 0 评论 -
关于int *p[n]和int (*p)[n]的超详细讲解
函数声明。原创 2023-01-17 09:23:47 · 2869 阅读 · 0 评论 -
C语言解析JSON源码
笔者前面提到的“稍稍修改了一下的版本”就是指添加了可以解析这种排版过后的 JSON 文本的功能。它与 XML 的地位差不多,但就笔者而言,笔者更喜欢 JSON 的风格,因为它更符合我们的思维习惯,同样一份数据,JSON 格式的就是比 XML 要清晰明了一些。在使用这个解析器解析 JSON 时,只需要将原始 JSON 字符串传入 cJSON_Parse() 函数中即可自动将整个字符串解析一遍,并创建对应的节点链表。至于这个解析器解析的流程,有兴趣的同学可以自己去跟踪 cJSON.c 的源码实现。原创 2022-11-15 16:07:11 · 3862 阅读 · 1 评论 -
C语言常见的错误及解决办法,避坑笔记
比如上面的例子,我们可以说malloc 函数分配的内存块是属于p 的,因为我们对这块内存的访问都需要通过p 来进行。但是我们要知道,assert 宏只是帮助我们调试代码用的,它的一切作用就是让我们尽可能的在调试函数的时候把错误排除掉,而不是等到Release 之后。malloc 函数的返回值是一个void 类型的指针,参数为int 类型数据,即申请分配的内存大小,单位是byte。因为系统会按照这个结构体中的某些特定成员的值去字库中寻找匹配的字体,当这些值与字库中某种字体的某些项匹配时,就调用这种字体。原创 2022-10-10 09:44:33 · 4470 阅读 · 0 评论 -
WF100DPZ 1BG S6 DT数字压力传感器
Measurement_control<1:0>:000b,表示单触发温度信号转换。011b:指示睡眠模式转换(周期性地执行一次组合转换,间隔时间为“sleep_time”),100b:OTP编程模式,在编程OTP存储体时进入该模式。Data_out:24位ADC输出数据,当“raw_Data_ on”=0且LSB等于(1/64)。Sleep_time:0000:0ms,0001:62.5ms,0010:125ms…Sco:1,转换开始,转换结束后自动返回0(睡眠模式转换除外)。原创 2022-09-05 17:39:26 · 1468 阅读 · 1 评论 -
C语言实现#软件设计模式#观察者模式
观察者模式定义:当对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新,也可以称这种模式发布-订阅模式应用场景:Excel 中的数据与折线图、饼状图、柱状图之间的关系;MVC 模式中的模型与视图的关系;事件模型中的事件源与事件处理者等等主要优点有,降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系,目标与观察者之间建立了一套触发机制当然也有缺点:当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率所谓技术利弊两面,取决于具体应用需求观察者模式的结原创 2022-06-11 19:12:56 · 278 阅读 · 0 评论 -
适配器模式
硬件适配器模式提供一种方法,使已经存在硬件接口能适用应用期望。可以说是在硬件代理模式基础上,为了能够适应底层不同的硬件设备,在中间增加一层适配器。比如在通讯上面在硬件上都存在RS232,RS485,程序需要在不同情况下使用232通讯或485通讯,而适配器可以提供统一的接口给客户层,通过指针指向所需通讯,则可以实现。最大的特点是在运行中选择,相比使用宏定义需要生成不同执行程序,可以在程序中实现自适应的功能。1.2.2.1 硬件适配器(HardwareAdapter)硬件适配器在客户和硬件代理之间执行匹配。客户原创 2022-06-09 22:57:15 · 226 阅读 · 0 评论 -
STM32下载代码后出现无法再次下载的问题
问题1、STM32CubeProgrammer 出现连接错误ST-LINK error (DEV_CONNECT_ERR)解决方案:下载时按reset重启可以解决该问题。原创 2022-06-09 22:00:25 · 2470 阅读 · 0 评论 -
CW2015 报警功能
当电池SOC低于或等于设定阈值[0x08]时,触发低SOC警报。 CW2015 设置 ALRT 标志为 1,并拉低 ALRT 引脚以通知外部主机。 ALRT 引脚保持逻辑低电平,直到主机通过 I2C 总线将 ALRT 标志复位为逻辑 0。当 SOC 保持在警报阈值以下时,清除的 ALRT 不会生成另一个警报信号。 在生成另一个中断之前,SOC 必须上升到高于然后下降到低于或等于警报阈值。...原创 2022-05-24 12:16:47 · 547 阅读 · 0 评论 -
AI 算力简介
FLOPS是Floating-point Operations Per Second的缩写,代表每秒所执行的浮点运算次数。现在衡量计算能力的标准是TFLOPS(每秒万亿次浮点运算)NVIDIA显卡算力表:https://developer.nvidia.com/cuda-gpus#compute例如: 以GTX680为例, 单核一个时钟周期单精度计算次数为两次,处理核个数 为1536, 主频为1006MHZ,那他的计算能力的峰值P 为:P = 2 × 1536 × 1006MHZ = 3.09TFL原创 2022-05-24 12:15:56 · 3762 阅读 · 0 评论 -
电量计方案
一.引言在当前的项目应用中,越来越多的设备使用电池供电,如果设备能够精确的了解电池的电量,不仅能够很好地保护了电池,防止其过放电,同时也能够让用户精确地知道剩余电量来估算所能使用的时间,及时地保存重要数据。二.设计目标设计方案能够较为准确的得到电池电量情况电路设计或者软件设计模块化,方便移植三.关键术语 术语、缩略语解 释电量计电量计(gas gauge /fuel gauge)是用来计量显示电池电量,通常包括mAh剩余容量(RM),满充容量(FCC)...原创 2022-05-24 12:14:31 · 3055 阅读 · 0 评论 -
STM32 flash擦写死机
在调试BootLoader的时候发现,APP中在擦写flash的时候造成了设备死机,后来发现在startup_stm32f103xb.s文件中设置的Stack_Size不一致造成的。将BootLoader和APP代码改为一致后该问题解决。分析原因:在bootloader中设置stack(栈)大小,在APP中不会设置这一部分,设置的大小过小,在操作flash时造成了stack溢出死机。...原创 2022-05-23 17:13:26 · 2984 阅读 · 0 评论 -
stm32wb55 flash
FLASH:如果在 Flash 存储器操作期间发生器件复位,则不能保证 Flash 存储器的内容。在对闪存进行编程/擦除操作期间,任何读取闪存的尝试都会使总线停止。一旦编程/擦除操作完成,读操作就会正确进行。解锁闪存复位后,不允许对 Flash 存储器控制寄存器 (FLASH_CR) 或 Flash 存储器 CPU2 控制寄存器 (FLASH_C2CR) 进行写操作,以保护 Flash 存储器免受因电气干扰等可能导致的意外操作。以下序列用于解锁这些寄存器:1. 将KEY1 = 0x4567原创 2022-05-20 17:56:35 · 541 阅读 · 0 评论 -
KeilMDK编译错误Error: L6218E: Undefined symbol __aeabi_assert (referred from xxx.o).
问题描述:AirPressure\AirPressure.axf: Error: L6218E: Undefined symbol __aeabi_assert (referred from mbrtu.o).问题原因:"Error: L6218E: Undefined symbol __aeabi_assert..." 能够发生是因为“Project ->Options for Target ->on theTarget tab - Use MicroLIB”...原创 2022-05-19 14:51:25 · 6514 阅读 · 0 评论 -
将多个BIN文件合成一个
将多个BIN文件合成一个摘录于:http://jingyan.baidu.com/article/e2284b2b5b23e5e2e6118db8.html下面的图片完全是从原文摘录过来的,这里本人绝无盗取原作者知识产权之意,只是为了本人备份知识,请读者阅读原文!...原创 2022-05-18 12:09:48 · 1240 阅读 · 0 评论 -
stm32wb55 BootLoader
1、stm32wb55中断数目:16个异常中断+63用户中断=79个中断,取2的幂次方,最小值为:128.地址必须被128*4=512=0x200整除,所以合法的地址可以取0x200, 0x400,0x600等。2、BootLoader跳转到app需要关闭中断,中断向量表设置完成后再打开中断。/////////////////////////////////////////////////////////////////////////////////////////////////////////原创 2022-05-18 11:36:54 · 244 阅读 · 0 评论 -
stm32 BootLoader之检查栈顶地址 复位地址
检查栈顶是否合法代码如下:#define STM32_APP_BASE 0x08020000 // APP flash start addressvoid iap_jumpapp(void){ // 检查栈顶是否合法,,确保栈顶落在0x24000000-0x24FFFFFF 之间,刚好在stm32h7的RAM范围内 if (((*(uint32_t*)(STM32_APP_BASE)) & 0xff000000 ) == 0x24000000 ...原创 2022-05-17 17:10:48 · 2868 阅读 · 1 评论 -
keil生成bin文件
1、keil无法生成axf文件之解决方法默认情况是生成 .axf 文件的,但有可能不能生成该文件。生成的 axf 文件名如 xx2.0 这种文件名带有小数点的,此时就不能够生成 axf 文件。通过配置里的 Output 选项卡即可重新命名。该名称改成如下时即可产生 axf 文件。axf 文件生成了 axf 文件之后,就可以使用命令将 axf 文件转为 bin 文件。2、生成bin文件一个更简单的办法,直接添加: fromelf.exe --bin -o "$L@L.bin" ".原创 2022-05-09 10:45:36 · 4350 阅读 · 0 评论 -
硬件代理模式
嵌入式系统,特别单片机最明显的是对硬件的直接访问。基础硬件不仅有CPU,内存,键盘,传感器,通讯RS232等这样的设备。做单片机的不得不对硬件进行控制,读,写操作,而这篇文章已解决管理和操作这些硬件通常的一个模式。或许对你来说并不陌生,但是是否能够系统的,详细的表达出来这就不仅仅只是了解就能达到的。下面讨论的设计模式已经在操作硬件上得到证明是可靠有效的。简单总结说,硬件代理模式是以封装详细信息为目的的硬件抽象的一个原型模式,它有可能改变提供给硬件或来自硬件的信息处理方法。硬件适配器模式扩展硬件代理模式,原创 2022-05-07 11:00:03 · 575 阅读 · 0 评论 -
无人机学习笔记
硬件首先从硬件开始说起把,气压计、陀螺仪、磁力计,这三个不用说肯定是必备的,后面由于开发的需要还添加了激光测距,以及光流。但是在开发过程中遇到了很多问题,一个一个来说。气压计气压计的原理其实就是通过读取当前的温度和气压值,再通过一定的计算来得到当前所处的高度。气压计有很明显的缺点,无论是温度还是无人机起飞后螺旋桨转动导致的气压升高等等,都会影响气压计的精准程度,所以最好在设计硬件的阶段,就要让气压计原理螺旋桨,也要控制它的温度。陀螺仪可以说整个开发过程中遇到的最大的问题就来自于陀螺仪了。原创 2022-04-29 15:39:12 · 1486 阅读 · 0 评论 -
按键扫描的实现方式
按键扫描实现的另一种方式:/*获取按键状态*/buttonEvent_e buttonGetState(){ buttonEvent_e currentState = state; state = buttonIdle; return currentState;}/*按键扫描处理*/void buttonProcess(){ static unsigned int lastTick; static unsigned int pressedTi...原创 2022-04-28 11:05:21 · 1738 阅读 · 0 评论 -
单片机延时方案
不带操作系统的另一种延时方式:1、设置一个定时器,定时器的定时基准为1ms/*滴答定时器初始化1ms中断一次*/void systickInit(){ NRF_TIMER2->TASKS_CLEAR = 1; //清除定时器 NRF_TIMER2->PRESCALER = 4; //2^4=16分频,16M/16=1Mhz NRF_TIMER2->CC[0] = 1000; //设置捕获比较值 NRF_...原创 2022-04-28 09:43:47 · 175 阅读 · 0 评论 -
接收、发送数据框架
/*接收到一个数据包rxq_head+1处理了一个数据包rxq_tail+1*/static EsbPacket rxPackets[TXQ_LEN];static int rxq_head = 0;static int rxq_tail = 0;1、初始化时,NRF_RADIO->PACKETPTR=(uint32_t)&rxPackets[rxq_head];2、接收时,NRF_RADIO->PACKETPTR = (uint32_t)&rxPackets原创 2022-04-27 17:32:09 · 271 阅读 · 0 评论 -
__packed 关键字 的作用
结构体里用了太多的变量,为了节省ram空间 可以加个__packed关键字修饰。举个例子:struct {char a; //1byteint b; //4bytechar c[2] //2bytedouble d; //8byte}Struct_A;在计算机内存中,结构体变量的存储通常是按字长对齐的,比如8位机里就按字节对齐,那么上述结构体共占用1+4+2+8=15byte。在16位机里,变量就按照2字节对齐,比如a这个成员,虽然是个char类型,地址在0x80000000本身只占1字原创 2022-04-27 15:31:03 · 1120 阅读 · 0 评论 -
LED(实现多个LED组合序列闪烁)
一、.h#include <stdint.h>#include <stdbool.h>#include <led.h>/*********************************led序列动作:*延时、停止、周期循环*********************************/#define LEDSEQ_WAITMS(X) (X)#define LEDSEQ_STOP -1#define LEDSEQ_LOOP ...原创 2022-04-26 09:11:07 · 414 阅读 · 0 评论 -
蜂鸣器操作代码(实现多种状态提示)
一、.h#define BEEP PCout(14)typedef struct{ bool isActive; bool isLoop; u16 waitMS;}beepSeq_t;enum beepAction{ TRIM_BEEP = 0, FLIP_BEEP, LOWPOWER_BEEP, CANFLY_BEEP,};void beepInit(void);void runBeepAcktion(enu...原创 2022-04-26 09:04:42 · 8518 阅读 · 0 评论 -
飞控中的IIR二阶滤波器
之前我们讲过一阶滤波器,思路就是把一个连续的滤波器形式,通过离散化的方式,转换成差分方程。同事拿着我的文章,对照着代码里的二阶滤波,表示完全看不懂,我说不可能,二阶不过是一阶的升级版,思路应是一样的,他说不信你看。我一看,WTF,这系数怎么来的?经验公式?这迭代怎么这种形式?没见过呀!行吧,说明之前咱理解的不到位,那就从头开始讲起吧。从模拟滤波器开始我们从书上,百度,查到的滤波器公式,通常是用传递函数表达的,这是s域下的表达形式,是连续的,这种我们称之为模拟滤波器。以巴特转载 2022-04-20 11:45:48 · 3354 阅读 · 0 评论 -
嵌入式相关开源项目、库、资料
EmbedSummary: 嵌入式大杂烩资源汇总原创 2022-05-24 12:17:25 · 165 阅读 · 0 评论 -
精选的开源框架与代码
当然也不要总是沉浸在开源的东西之中无法自拔,开源虽然是一种很好的品质,但是开源的未必就一定是好东西~下面是bug菌推荐的一些不错的开源项目和代码,大家有时间可以参考学习~1开源RTOSbug菌最早接触的开源代码,应该就是FreeRTOS了,从接触到现在对于该RTOS的代码研读应该有3遍的样子,虽然工作以后也会用到其他的RTOS,感觉都大同小异,因为他们封装的服务接口都很类似,一通百通,所以后面接触的uCOS和RTThread虽然有时候也会看会代码,但终究没有从头到尾研读过,除非遇到了一些更底原创 2022-04-07 17:32:59 · 481 阅读 · 0 评论 -
补码(为什么按位取反再加一)
一、首先,阅读这篇文章的你,肯定是一个在网上已经纠结了很久的读者,因为你查阅了所有你能查到的资料,然后他们都会很耐心的告诉你,补码:就是按位取反,然后加一。准确无误,毫无破绽。但是,你搜遍了所有俯拾即是而且准确无误的答案,却仍然选择来看这篇毫不起眼的文章,原因只有一个,只因为你还没有得到你想要的东西。 因为你想要的,不是1+1=2,而是,1+1为什么等于2。当然,我们不讨论1+1的问题。我们讨论的,是补码。 你已经困惑了很久,你明明知道补码就是按位...原创 2022-04-07 12:15:14 · 5037 阅读 · 7 评论 -
状态机-用C语言实现进程5状态模型
前言状态机在实际工作开发中应用非常广泛,在刚进入公司的时候,根据公司产品做流程图的时候,发现自己经常会漏了这样或那样的状态,导致整体流程会有问题,后来知道了状态机这样的东西,发现用这幅图就可以很清晰的表达整个状态的流转。一口君曾经做过很多网络协议模块,很多协议的开发都必须用到状态机;一个健壮的状态机可以让你的程序,不论发生何种突发事件都不会突然进入一个不可预知的程序分支。本篇通过C语言实现一个简单的进程5状态模型的状态机,让大家熟悉一下状态机的魅力。什么是状态机?定义状态机是有限状态原创 2022-04-02 15:19:04 · 1125 阅读 · 0 评论 -
VS:C++的pthread出错
1、安装pthread点击下载2、下载缺失文件地址:ftp://sourceware.org/pub/pthreads-win32/pthreads-w32-2-9-1-release.zip解压得到文件3、VS的include配置点击 项目——>属性——按照图示点选,将下载的缺失文件的include的路径填写到”包含目录那一栏内”4、VS的lib配置点击 项目——>属性——按照图示点选,将下载的缺失文件的lib的...原创 2022-04-02 12:14:50 · 1491 阅读 · 0 评论