正点原子LCD IAR上移植,带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 运行不起来的原因)

  1. 首先我发现lcd.c中的屏幕初始化函数 lcd_init 下面的函数 lcd_ex_ili9341_reginit用到了delay_ms函数,而这个函数前面会执行函数delay_init,里面有个宏:SYS_SUPPORT_OS 默认是0,关闭状态,只有用了UCOSII才需要将它写为1在这里插入图片描述

  2. 解决了delay_ms卡死问题,发现任务创建还是会失败,Debug发现中断嵌套标志OSIntNesting不为0,所以任务创建不成功

  3. 按常理来讲,OSInit函数会将OSIntNesting置0,保证任务能够创建成功,但是执行程序后发现,OSIntNesting为1,因此任务创建不成功在这里插入图片描述

  4. 经过仔细检查发现了一个非常有意思的bug,lcd.c文件中初始化函数lcd_init中有一个函数是正点原子添加的,专门为MDK开发准备的,当时我在想我用的IAR,会不会是这个玩意儿导致了程序的问题,于是我试着把他注释掉了(本质上他是个while循环用来延时,对程序没有帮助在这里插入图片描述

  5. 将这行代码注释掉
    在这里插入图片描述

  6. 再去调试创建任务的代码,就会发现OSIntNesting变成了0,可以成功创建并且运行UCOS的任务了在这里插入图片描述

  7. 在任务里写上代码,内容为每秒数字加一,并显示,观察一下运行效果

在这里插入图片描述
在这里插入图片描述

问题虽然解决了,但是有个问题我不能理解,懂的可以交流

为什么注释掉的函数只是个循环,但是影响了OS_InitEventList函数的运行结果呢?OS_MenClr()函数只是一个清内存函数,为什么会导致中断嵌套标志从0变成1
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值