中级会员
 
- 积分
- 422
- 金钱
- 422
- 注册时间
- 2016-11-19
- 在线时间
- 111 小时
|
移植的modbus裸机上跑了一年多没碰见过,在UCOSIII上任务少的时候也没问题,在做到16个线程的时候,modbus由于是和网络通信,网络不好,断网的情况下程序就跑死。1.跟踪调试,死在 BEAB BKPT 0xAB
网上说这是使用了半主机模式造成的,勾选上微库就行了,但是由于modbus使用了assert这个函数,最开始移植的时候就没有使用微库。
那就只能按照网上的说法,增加了以下函数,在不使用微库的情况下避免使用半主机模式
#include "stdio.h"
#pragma import(__use_no_semihosting_swi)
#pragma import(__use_no_semihosting)
struct __FILE
{
int handle;
};
FILE __stdout;
void _sys_exit(int ch)
{
ch=ch;
}
void _ttywrch(int ch)
{
ch=ch;
}
2.跑了一段时间后还是死机,这次又死在hardfault里面,而且这时候的死机根本就跟踪不到是死在哪里,这TM就很尴尬了,网上的方法试遍了都不行,眼看项目交期就要到了
我都准备把这个项目重新写裸机程序了,突然想到最开始死在 BEAB BKPT 0xAB 的时候还出现过一个函数 __aeabi_assert,在程序里全局搜索,发现在assert.h文件里只有引用没有定义,
那就死马当活马医了,在上面的文件里加入以下函数,跑了一星期人为制造了各种异常,再没死机
void __aeabi_assert(const char * x1, const char * x2, int x3)
{
x1=x1;
x2=x2;
x3=x3;
}
3.经验证,只需要定义这一个函数 __aeabi_assert就能避免死机问题,而且有强迫症的同学,为了避免出现警告,建一个retarget.c文件,函数定义在此文件里面
4.不要问我为什么,其实我也不知道,时间来得及的话还是自己写modbus协议吧,写那3,4个常用的功能码就行,移植官方的总会有这样那样的问题,费劲!!
|
|