stm32 ucos/ii移植,程序执行到OSStart()内部的OSStartHighRdy()语句时跑飞问题解决办法之一
网络上的一些解决办法:
stm32程序遇到OSStartHang的问题解决方法总结
但并不适合我遇到的情况。
我的情况是已经能够正确的运行程序切换,然后增加一了个任务,并在任务中实现信号量的请求。同时在原有任务中增加信号量的发布,用来验证信号量功能。
增加信号量请求功能后,程序就不再正常,用调试方式单步运行时,程序总是崩溃在OSStartHighRdy汇编语言处,表现为程序进行了死循环,没有进入pend_sv中断;采用断点方式运行时,程序跑到OSSemPend()的结尾在返回时出现问题。
结合Keil5软件的调试功能报告:显示为总线异常-IMPERISERR,看到网上的资料和CM3核指南,判定为数据类型类问题。
各种数据类型问题请检查了,最后发现是指针的问题,
在我的程序中:
OSSemPend(sem_ex, timout, perr);
其中第三个参数是(INT8U *)类型,原程序中我直接用:
INT8U * perr;
进行定义,没有进行指针的初始化就直接使用了。
进行如下修改
char str1[50]="中国\r\n";
INT8U *perr = (INT8U *) &str1[0];
程序正常运行:
教训:指针变量声明之后必须进行初始化!