<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[weekman93的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/weekman93</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; weekman93]]></copyright><item><title><![CDATA[IAR+ARM出现某个全局变量的值异常变化，或某个函数执行结果突然不符合预期的问题原因分析]]></title><link>https://blog.youkuaiyun.com/weekman93/article/details/127899396</link><guid>https://blog.youkuaiyun.com/weekman93/article/details/127899396</guid><author>weekman93</author><pubDate>Thu, 17 Nov 2022 10:49:39 +0800</pubDate><description><![CDATA[问题描述:程序其他执行逻辑都正确，但是突然发现某个全局变量的值不按照预期的设计变化（比如，本来还每秒钟累加一次，结果值变成一个特别大的值且不变化）。或者发现某个函数执行逻辑与预期不符。
问题原因分析:通过单步调试程序，发现是程序执行到某个中断服务函数A后，全局变量或函数才开始变得异常。分析该中断回调函数的内容，发现其中使用了两个长度为1000字节左右的数组。同时，再结合程序编译后生成的map文件，发现map文件中为中断服务函数栈空间分配的2048字节。而从map文件可以看到该中断服务函数A所占用的中断栈空间]]></description><category></category></item><item><title><![CDATA[IAR+ARM出现synchronous external abort错误原因分析（2）]]></title><link>https://blog.youkuaiyun.com/weekman93/article/details/127898959</link><guid>https://blog.youkuaiyun.com/weekman93/article/details/127898959</guid><author>weekman93</author><pubDate>Thu, 17 Nov 2022 10:34:57 +0800</pubDate><description><![CDATA[问题描述:当程序某个高优先级的中断触发后（如pcie中断），或者底层接口物理链路初始化的一瞬间，原本正常运行的程序突然进入异常中断程序，并报出“synchronous external abort”错误。
问题原因分析:通过排查代码，发现是由于串口接收中断服务函数中将接收缓冲区指定为一个固定长度的结构体（例如:仅容纳一帧串口数据的13个字节）。结果发现在高优先级中断触发或底层接口物理链路初始化时，cpu被占用，未能够及时响应串口接收中断，导致下次正常进入串口接收中断函数后，一次读取出两帧数据（26个字节）。]]></description><category></category></item><item><title><![CDATA[IAR+ARM出现“synchronous external abort“异常可能的原因分析]]></title><link>https://blog.youkuaiyun.com/weekman93/article/details/126782552</link><guid>https://blog.youkuaiyun.com/weekman93/article/details/126782552</guid><author>weekman93</author><pubDate>Tue, 20 Sep 2022 10:12:39 +0800</pubDate><description><![CDATA[问题描述:在中断服务函数中，一个函数按传值的方式传递参数，该参数占据2000字节左右，结果发现进入该函数程序就报出synchronous external abort错误，经过排查和分析，是由于参数占用空间太大，函数入栈时，导致栈空间溢出。
解决办法:使用传指针的方式传递该函数参数即可解决该问题。

]]></description><category></category></item><item><title><![CDATA[LwIP的TCP客户端先于服务端启动情况下，无法正常连接服务器端的解决办法]]></title><link>https://blog.youkuaiyun.com/weekman93/article/details/126281582</link><guid>https://blog.youkuaiyun.com/weekman93/article/details/126281582</guid><author>weekman93</author><pubDate>Thu, 11 Aug 2022 11:18:53 +0800</pubDate><description><![CDATA[LwIP的TCP客户端先于服务端启动情况下，无法正常连接服务器端的解决办法]]></description><category></category></item><item><title><![CDATA[LWIP TCP接收端不主动发送ACK导致接收异常问题分析]]></title><link>https://blog.youkuaiyun.com/weekman93/article/details/124891827</link><guid>https://blog.youkuaiyun.com/weekman93/article/details/124891827</guid><author>weekman93</author><pubDate>Fri, 20 May 2022 22:48:27 +0800</pubDate><description><![CDATA[1.问题场景描述
本机运行LWIP协议栈，作为TCP客户端负责接收数据，上位机使用标准TCPIP协议栈并使用socket套接字，作为服务器端按照100ms周期向客户端发送数据。通信链路为千兆以太网，且整个网络仅有两个节点。在数据交互的过程中发现，客户端的TCP链接不稳定，频繁与服务器端断开链接，无法正常接收服务器端的数据。
2.问题分析与排查
由于服务器端是使用标准socket套接字编程，且经过长期验证，因此问题出现点大概率为使用LWIP协议栈的客户端。排查过程中，首先将服务器端的数据速率由100ms降低为]]></description><category></category></item><item><title><![CDATA[方法：IAR+ARM cortex A7出现非对齐异常（Alignment Fault）的解决办法]]></title><link>https://blog.youkuaiyun.com/weekman93/article/details/124215098</link><guid>https://blog.youkuaiyun.com/weekman93/article/details/124215098</guid><author>weekman93</author><pubDate>Sat, 16 Apr 2022 16:24:45 +0800</pubDate><description><![CDATA[解决IAR+ARM环境环境下，无法使用非4字节对齐结构体的问题]]></description><category></category></item><item><title><![CDATA[方法：vivado提示 “由于找不到vcomp140.dll，无法继续执行代码。重新安装程序可能会解决此问题”的解决办法]]></title><link>https://blog.youkuaiyun.com/weekman93/article/details/122463882</link><guid>https://blog.youkuaiyun.com/weekman93/article/details/122463882</guid><author>weekman93</author><pubDate>Wed, 12 Jan 2022 22:27:01 +0800</pubDate><description><![CDATA[解决办法：
1.进入控制面板，直接卸载旧的vc++15（不要选择修复，因为有可能修复也会报错）；
2.通过如下链接下载新版的vc++15的安装程序（vc_redist.x64.exe)
点我下载程序
3.下载完毕后，直接安装即可搞定；

...]]></description><category></category></item><item><title><![CDATA[RS232 RS422 RS485 DB9公座脚定义]]></title><link>https://blog.youkuaiyun.com/weekman93/article/details/122449558</link><guid>https://blog.youkuaiyun.com/weekman93/article/details/122449558</guid><author>weekman93</author><pubDate>Wed, 12 Jan 2022 11:22:24 +0800</pubDate><description><![CDATA[]]></description><category></category></item><item><title><![CDATA[将内存长度size，按照对齐长度align向上对齐]]></title><link>https://blog.youkuaiyun.com/weekman93/article/details/121625118</link><guid>https://blog.youkuaiyun.com/weekman93/article/details/121625118</guid><author>weekman93</author><pubDate>Tue, 30 Nov 2021 09:37:18 +0800</pubDate><description><![CDATA[记录一种用于将内存长度按照对齐长度向上对齐的宏定义方法
#define ALIGNMENT  4
#define ALIGN_SIZE(size)    (((size)+ALIGNMENT-1) &amp;~(ALIGNMENT-1))

]]></description><category></category></item><item><title><![CDATA[度数-码盘值-密位转换工具（含十进制与十六机制）]]></title><link>https://blog.youkuaiyun.com/weekman93/article/details/120188491</link><guid>https://blog.youkuaiyun.com/weekman93/article/details/120188491</guid><author>weekman93</author><pubDate>Wed, 08 Sep 2021 22:27:03 +0800</pubDate><description><![CDATA[有时需要涉及到度数、码盘值和密位之间的相互转换，并且会存在十进制与十六进制两种情况，因此，根据这个需求基于QT平台编写了一个度数-码盘值-密位转换工具。使用效果如下图所示：

使用时，可以在上面六个输入框中的任意一个输入一个数据，将得到其余五个转换后的值。

...]]></description><category></category></item><item><title><![CDATA[记录:MIPS64位架构下指针强制转换为int时遇到的问题]]></title><link>https://blog.youkuaiyun.com/weekman93/article/details/119395154</link><guid>https://blog.youkuaiyun.com/weekman93/article/details/119395154</guid><author>weekman93</author><pubDate>Wed, 04 Aug 2021 23:08:30 +0800</pubDate><description><![CDATA[一、问题描述
在MIPS64位架构下执行如下强制转换时，第3行代码会出现精度丢失错误，程序无法编译通过：
第1行    unsigned char a =0；
第2行    unsigned char *pa =&amp;a;
第3行    int addr =( int ) pa;
但是同样的代码在win32平台下(vs 2017)下可正常编译运行。
二、原因分析
在MIPS64位架构下，指针类型为64位，即8个字节。而int类型为32位，4个字节。所以在进行强制转换时，由于字节长度不匹配，将会出现精度丢]]></description><category></category></item><item><title><![CDATA[若VxWorks浮点数计算值异常变化，需要添加VX_FP_TASK选项]]></title><link>https://blog.youkuaiyun.com/weekman93/article/details/118657696</link><guid>https://blog.youkuaiyun.com/weekman93/article/details/118657696</guid><author>weekman93</author><pubDate>Sun, 11 Jul 2021 18:23:13 +0800</pubDate><description><![CDATA[最近在测试VxWorks程序时，新增加了一个浮点数处理函数A，任务中需要以传参的方式调用函数A，然后函数A将以指针方式返回计算结果。
出现的问题是:固定传参条件下，函数A返回的浮点数值会随机变化。
排查问题时发现传入函数A的某个浮点参数arg的原始值为32768.0，但在函数A中变为了NaN。
最开始怀疑是任务堆栈大小不够了，扩大堆栈，问题依旧。
最后才发现是在初始化任务A时，没有使用浮点数选项VX_FP_TASK，添加后，不再出现函数返回值随机变化的问题。
查阅资料发现，如果在没有使用VX_FP_TASK]]></description><category></category></item><item><title><![CDATA[写一个会导致“Run-Time Check Failure #2-Stack around the variable ‘XXX‘ was corrupted”的BUG]]></title><link>https://blog.youkuaiyun.com/weekman93/article/details/118615844</link><guid>https://blog.youkuaiyun.com/weekman93/article/details/118615844</guid><author>weekman93</author><pubDate>Fri, 09 Jul 2021 23:01:56 +0800</pubDate><description><![CDATA[1.程序描述
#include &lt;stdio.h&gt;

int main()
{
	int a =0;
	short b = 0;

	scanf("%d",&amp;a);
	scanf("%d",&amp;b);

	printf("a=%d\n",a);
	printf("b=%d\n",b);

	return 0;
}

2.程序执行
依次输入5和6，对变量a和b进行赋值，结果出现如下图所示的错误信息：

3.BUG分析
先说产生这个问题的原因：因为局部变量b的类型为short型，占据2]]></description><category></category></item><item><title><![CDATA[基础：基于链表的空闲队列与工作队列示例]]></title><link>https://blog.youkuaiyun.com/weekman93/article/details/117201789</link><guid>https://blog.youkuaiyun.com/weekman93/article/details/117201789</guid><author>weekman93</author><pubDate>Sun, 23 May 2021 22:24:54 +0800</pubDate><description><![CDATA[0 简介
本示例使用最基础的链表结构体，演示了空闲队列与工作队列的使用方式。主要构建了两个函数：insertToTail()和getFromHead()。其中，insertToTail()用于向一个链表的尾部插入一个元素，getFromHead()用于从一个链表的头部摘取一个元素。
主函数的执行流程是：
1.首先静态分配10个链表元素；
2.然后依次将这10个元素插入到由指针freeListPtr指向的空闲队列的尾部，插入完成后，输出空闲链表当前长度，并从链表头部依次打印这10个元素的数据值；
3.接着，从]]></description><category></category></item><item><title><![CDATA[方法：柔性数组及其内存分配方式]]></title><link>https://blog.youkuaiyun.com/weekman93/article/details/117091878</link><guid>https://blog.youkuaiyun.com/weekman93/article/details/117091878</guid><author>weekman93</author><pubDate>Thu, 20 May 2021 21:13:08 +0800</pubDate><description><![CDATA[柔性数组的简要示例]]></description><category></category></item><item><title><![CDATA[方法：使用宏定义，实现调试信息的可控输出]]></title><link>https://blog.youkuaiyun.com/weekman93/article/details/113763152</link><guid>https://blog.youkuaiyun.com/weekman93/article/details/113763152</guid><author>weekman93</author><pubDate>Mon, 08 Feb 2021 21:59:29 +0800</pubDate><description><![CDATA[0.目标
使用宏定义，实现调试信息可控输出。可对调试信息进行等级分类，并分级输出调试信息，在嵌入式操作系统环境下（如VxWorks），还可以根据实际需求，打开或关闭对应等级的调试信息，方便bug排查。
1.代码
#include &lt;stdio.h&gt;

#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]]></description><category></category></item><item><title><![CDATA[细节：与大神交流记录]]></title><link>https://blog.youkuaiyun.com/weekman93/article/details/113762737</link><guid>https://blog.youkuaiyun.com/weekman93/article/details/113762737</guid><author>weekman93</author><pubDate>Mon, 08 Feb 2021 21:27:53 +0800</pubDate><description><![CDATA[0.前言
俗话说“听君一席话，胜读十年书”，在项目执行过程中有幸同一位大神进行了一次交流。收获良多，特记录于此，以供后参。
1.使用柔性数组
在C99标准中，添加了一个新特性——柔性数组：
typedef struct
{
    int len;
    char buf[0];
}SOFT_ARR,*SOFT_ARR_PTR;
上述结构体类型SOFT_ARR中的成员buf即为柔性数组。其中，sizeof(SOFT_ARR)的结果为4，表明结构体成员buf并未占用内存空间。
可以按照如下两种方式使用柔性数]]></description><category></category></item><item><title><![CDATA[细节：强协议相关性软件开发流程及注意事项]]></title><link>https://blog.youkuaiyun.com/weekman93/article/details/113575287</link><guid>https://blog.youkuaiyun.com/weekman93/article/details/113575287</guid><author>weekman93</author><pubDate>Tue, 02 Feb 2021 22:03:45 +0800</pubDate><description><![CDATA[开发流程
1.通信接口连通性测试，确保CAN、网口、串口等外部接口收发无误；
2.高低温环境试验，确保数据收发无误；
3. 根据协议添加相关代码（数据结构、宏定义、函数定义），并使用CAN、网络调试助手进行模拟自测试；
4. 与外单位进行设备联调，确保信息交互软件收发数据的正确性；
5. 同操控上位机进行联调，确保由上位机下发的数据能够正确转发到设备，且能够将设备反馈的数据正确转发回上位机；
注意事项
1. 大部分时间是用在接口连通性测试、协议商定上的，协议商定的时间周期长短，将影响实际编码时间。
2. 注]]></description><category></category></item><item><title><![CDATA[细节：使用网络调试助手遇到的坑坑]]></title><link>https://blog.youkuaiyun.com/weekman93/article/details/113256232</link><guid>https://blog.youkuaiyun.com/weekman93/article/details/113256232</guid><author>weekman93</author><pubDate>Wed, 27 Jan 2021 17:28:24 +0800</pubDate><description><![CDATA[近期一个项目中需要使用多任务同时向一个udp套接字发送数据，上位机使用网络调试助手接收数据。
  发送数据长度14个字节，每个任务发送10000次，因此理论上上位机应该收到280000个字节。
  但是实际测试时发现如下问题：
  当两个任务通过udp发送数据的周期小于4ms时，上位机调试助手收到的字节数小于28万。

问题分析：
开始以为是没有将套接字的sendto函数进行互斥保护，结果查资料发现sendto函数是不需要进行互斥保护的。
后来突然想到会不会是网络调试助手接收后显示不过来，于是将网络调试..]]></description><category></category></item><item><title><![CDATA[TMS320C6678LE开发板环境搭建及使用说明（下）]]></title><link>https://blog.youkuaiyun.com/weekman93/article/details/110563401</link><guid>https://blog.youkuaiyun.com/weekman93/article/details/110563401</guid><author>weekman93</author><pubDate>Thu, 03 Dec 2020 20:27:28 +0800</pubDate><description><![CDATA[目录3. 软件环境搭建3.1.软件清单3.2.搭建步骤3.3.HelloWorld测试工程3.3.1.新建CCS项目3.3.2.程序编写与构建3.3.3.新建目标配置文件3.3.4.目标配置3.3.5.开启Debug模式，运行程序
3. 软件环境搭建
3.1.软件清单
表 2 软件清单




序号
名称
备注




1
CCS5.2.1.00018_win32
CCS5.2.1开发环境安装包


2
ti_emupack_5.0.838.0
仿真器补丁包


3
ti_emupack_keystone1]]></description><category></category></item></channel></rss>