正点原子LCD IAR上移植,带UCOSII 踩坑记录:解决lcd初始化后,无法创建任务,UCOSII无法正常运行问题
踩坑记录
最近在使用正点原子的Mini开发板学习,本来想用lcd屏幕和DHT11传感器做一个屏幕显示温湿度的小项目来驱动自己学习,因为之前已经在IAR上进行了UCOS的移植,所以想把这个项目用UCOS任务机制来实现
引脚配置
正点原子的HAL库例程直接用就可以,引脚都不用换,CUBEMX也不用配置使能等,都写好了,非常方便移植,除非自己画板子,需要改下lcd.h中的引脚宏定义
需要添加的文件(当然包括他们对应的头文件)
需要注意的是,lcd_ex.c不能添加到IAR工程中,但是要放到目录下
函数调用(怎么初始化lcd)
函数调用部分,因为我用的CubeMX直接生成的工程,而且使用ucos任务机制,因此我的main函数的while(1)中没有内容
key_init();
delay_init(72); //这一步一定要,也是例程中的
lcd_init(); //正点原子的代码
g_point_color = RED;
OSTaskStart(); //创建任务等,一定要写在最后
为什么说有坑?(lcd程序在ucosII上跑不起来)
我发现在while(1)中写代码,lcd都能正常显示,但是写到ucos中,任务甚至都不能正常创建,于是我开始了苦逼的Debug过程
苦逼的Debug过程(找出UCOSII 运行不起来的原因)
-
首先我发现lcd.c中的屏幕初始化函数
lcd_init
下面的函数lcd_ex_ili9341_reginit
用到了delay_ms
函数,而这个函数前面会执行函数delay_init
,里面有个宏:SYS_SUPPORT_OS
默认是0,关闭状态,只有用了UCOSII才需要将它写为1 -
解决了
delay_ms
卡死问题,发现任务创建还是会失败,Debug发现中断嵌套标志OSIntNesting
不为0,所以任务创建不成功 -
按常理来讲,
OSInit
函数会将OSIntNesting
置0,保证任务能够创建成功,但是执行程序后发现,OSIntNesting
为1,因此任务创建不成功 -
经过仔细检查发现了一个非常有意思的bug,lcd.c文件中初始化函数
lcd_init
中有一个函数是正点原子添加的,专门为MDK开发准备的,当时我在想我用的IAR,会不会是这个玩意儿导致了程序的问题,于是我试着把他注释掉了(本质上他是个while循环用来延时,对程序没有帮助) -
将这行代码注释掉
-
再去调试创建任务的代码,就会发现
OSIntNesting
变成了0,可以成功创建并且运行UCOS的任务了 -
在任务里写上代码,内容为每秒数字加一,并显示,观察一下运行效果
问题虽然解决了,但是有个问题我不能理解,懂的可以交流
为什么注释掉的函数只是个循环,但是影响了OS_InitEventList
函数的运行结果呢?OS_MenClr()
函数只是一个清内存函数,为什么会导致中断嵌套标志从0变成1