
方法汇总
weekman93
这个作者很懒,什么都没留下…
展开
-
IAR+ARM出现某个全局变量的值异常变化,或某个函数执行结果突然不符合预期的问题原因分析
问题描述:程序其他执行逻辑都正确,但是突然发现某个全局变量的值不按照预期的设计变化(比如,本来还每秒钟累加一次,结果值变成一个特别大的值且不变化)。或者发现某个函数执行逻辑与预期不符。问题原因分析:通过单步调试程序,发现是程序执行到某个中断服务函数A后,全局变量或函数才开始变得异常。分析该中断回调函数的内容,发现其中使用了两个长度为1000字节左右的数组。同时,再结合程序编译后生成的map文件,发现map文件中为中断服务函数栈空间分配的2048字节。而从map文件可以看到该中断服务函数A所占用的中断栈空间原创 2022-11-17 10:49:39 · 1194 阅读 · 1 评论 -
IAR+ARM出现synchronous external abort错误原因分析(2)
问题描述:当程序某个高优先级的中断触发后(如pcie中断),或者底层接口物理链路初始化的一瞬间,原本正常运行的程序突然进入异常中断程序,并报出“synchronous external abort”错误。问题原因分析:通过排查代码,发现是由于串口接收中断服务函数中将接收缓冲区指定为一个固定长度的结构体(例如:仅容纳一帧串口数据的13个字节)。结果发现在高优先级中断触发或底层接口物理链路初始化时,cpu被占用,未能够及时响应串口接收中断,导致下次正常进入串口接收中断函数后,一次读取出两帧数据(26个字节)。原创 2022-11-17 10:34:57 · 3268 阅读 · 0 评论 -
方法:IAR+ARM cortex A7出现非对齐异常(Alignment Fault)的解决办法
解决IAR+ARM环境环境下,无法使用非4字节对齐结构体的问题原创 2022-04-16 16:24:45 · 3178 阅读 · 0 评论 -
方法:vivado提示 “由于找不到vcomp140.dll,无法继续执行代码。重新安装程序可能会解决此问题”的解决办法
解决办法:1.进入控制面板,直接卸载旧的vc++15(不要选择修复,因为有可能修复也会报错);2.通过如下链接下载新版的vc++15的安装程序(vc_redist.x64.exe)点我下载程序3.下载完毕后,直接安装即可搞定;...原创 2022-01-12 22:27:01 · 12474 阅读 · 0 评论 -
写一个会导致“Run-Time Check Failure #2-Stack around the variable ‘XXX‘ was corrupted”的BUG
1.程序描述#include <stdio.h>int main(){ int a =0; short b = 0; scanf("%d",&a); scanf("%d",&b); printf("a=%d\n",a); printf("b=%d\n",b); return 0;}2.程序执行依次输入5和6,对变量a和b进行赋值,结果出现如下图所示的错误信息:3.BUG分析先说产生这个问题的原因:因为局部变量b的类型为short型,占据2原创 2021-07-09 23:01:56 · 280 阅读 · 0 评论 -
基础:基于链表的空闲队列与工作队列示例
0 简介本示例使用最基础的链表结构体,演示了空闲队列与工作队列的使用方式。主要构建了两个函数:insertToTail()和getFromHead()。其中,insertToTail()用于向一个链表的尾部插入一个元素,getFromHead()用于从一个链表的头部摘取一个元素。主函数的执行流程是:1.首先静态分配10个链表元素;2.然后依次将这10个元素插入到由指针freeListPtr指向的空闲队列的尾部,插入完成后,输出空闲链表当前长度,并从链表头部依次打印这10个元素的数据值;3.接着,从原创 2021-05-23 22:24:54 · 861 阅读 · 0 评论 -
方法:使用宏定义,实现调试信息的可控输出
0.目标使用宏定义,实现调试信息可控输出。可对调试信息进行等级分类,并分级输出调试信息,在嵌入式操作系统环境下(如VxWorks),还可以根据实际需求,打开或关闭对应等级的调试信息,方便bug排查。1.代码#include <stdio.h>#define DBG_CAN_INFO g_dbg_can_info_level#define DBG_TCP_INFO g_dbg_tcp_info_level#define DBG_UDP_INFO g_dbg_udp_info_leve原创 2021-02-08 21:59:29 · 396 阅读 · 0 评论 -
细节:与大神交流记录
0.前言俗话说“听君一席话,胜读十年书”,在项目执行过程中有幸同一位大神进行了一次交流。收获良多,特记录于此,以供后参。1.使用柔性数组在C99标准中,添加了一个新特性——柔性数组:typedef struct{ int len; char buf[0];}SOFT_ARR,*SOFT_ARR_PTR;上述结构体类型SOFT_ARR中的成员buf即为柔性数组。其中,sizeof(SOFT_ARR)的结果为4,表明结构体成员buf并未占用内存空间。可以按照如下两种方式使用柔性数原创 2021-02-08 21:27:53 · 147 阅读 · 0 评论 -
方法:使用Excel和Notepad++批量写代码
有时候需要进行大量代码的编写,而这些代码基本不涉及逻辑,仅仅是一些打印信息。那么,如果在需要大量打印这种信息时,怎么高效地编写代码呢?原创 2020-07-31 22:59:49 · 726 阅读 · 0 评论 -
细节:使用scanf函数输入数据时的注意事项,若使用不当会导致程序进入死循环。
正常情况下,使用如下的scanf语句就可以向变量a循环输入一个十六进制的值。但是这种scanf的用法有问题吗?答案是有的。问题就在于输入一个非十六进制数的字符就会导致scanf获取值失败,程序进入死循环。原创 2020-07-30 23:22:26 · 1122 阅读 · 1 评论 -
细节:使用scanf同时输入两个不同类型的变量可能会踩到的坑(既可能导致栈空间损坏,也可能会导致其中一个变量老是为0)
从表面上而言,看到scanf()数都会觉得这个函数很简单,就是按照给定的格式获取输入数据。但是在实际使用时才发现这个函数还是有一些坑值得注意的。下面分别对使用scanf()的正确情况和错误情况进行记录,以备后用。原创 2020-07-28 23:24:10 · 3691 阅读 · 0 评论 -
方法:解决同一文件的同一行代码,在sourceinsight与notepad++中的行号不同的问题
如果出现同一个文件中的同一行代码,在sourceinsight中与notepad++或其他IDE中的行号不同的现象,很有可能是sourceinsight的换行格式没有设置正确,可以尝试如下设置是否能够解决问题原创 2020-07-17 22:27:18 · 569 阅读 · 0 评论 -
方法:使用Visio中的页面内引用(超链接),实现形状之间的跳转
在Visio中绘制程序流程图时,有时可能由于程序过于复杂,导致一个页面都画不下整个流程。这时,一般需要进行页面内引用原创 2020-07-14 22:59:51 · 10540 阅读 · 0 评论 -
方法:在Visio中自定义可以同时在上下两个形状中输入数据的形状
方法:在Visio中自定义可以同时在上下两个形状中输入数据的形状原创 2020-07-10 22:59:59 · 1537 阅读 · 0 评论