STM32 ucosii调试过程中遇到的问题
问题1:使用ucosii V2.86基础上,按键程序使用的是外部中断,在起始任务中建立按键任务,并且建立消息邮箱,在外部中断服务子程序中获得按键值,再把按键值通过邮箱发送出来,然后在按键任务中执行相关操作,这一步已经实现;现在要在按键任务中按某一个键后建立检测任务,执行完一次采集任务后就把任务删掉。采集任务是通过定时器中断接收AD7789采集到的数据,2ms进一次中断,100ms获取一次采集值。然后通过按键值实现开始检测任务也可以中途取消检测任务。但是添加了检测任务后出现,只能完整的执行一次采集任务,第一次采集任务执行完以后按键就失灵,并且在执行第一次采集任务时,不能实现中途中断任务的功能?
调试步骤:① 在按键中屏蔽掉建立采集任务语句,按键可以正常实现 ;
② 建立一个测试函数,在此函数中模拟采集任务 LED亮3S再灭3S 循环执行此语句6次 ,发现也能实现建立任务,中途取消任务,多次测量 ;
③ 通过以上推断出是定时器中断导致任务不能正常执行 所以在检测任务中国所有打开定时器中断的语句 屏蔽掉 再一次执行检测任务,可以正常实现任务开始 中途取消 多次测量,验证确实是定时器中断的问题 ;
④ 单步调试有定时器中断和没有定时器中断的检测任务发现 执行完一次检测后 按键还能够进入外部中断获取,并且获取到正确的按键值,但是在执行OSMboxPost前发现 建立的按键邮箱结构体中的OSEventType 由1变成了0
⑤ 然后在有定时器中断的检测任务中 单步调试发现是执行检测任务过程中把OSEventType 变成了0 导致执行OSMboxPost函数里的
if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
return (OS_ERR_EVENT_TYPE);
就直接返回了而没有把消息邮箱发送出来
⑥调试发现 打开定时器中断后,只要一调用ucosii带的延时函数就会把OSEventType清零,把所有ucosii带的延时函数都改成自己写的延时函数看效果
⑦把所有ucosii延时函数更换成自己写的延时函数,也会导致OSEventType清零,推测延时函数太长导致,把所有延时时间改短
⑧把所有延时函数改成50ms就不会有清零的现象发生,当延时时间为150ms没有问题,当延时时间为200ms时,在其中的一个延时函数后,消息邮箱结构体中的OSEventGrp变成1,再下一个延时函数时OSEventGrp和OSEventType两个都一起清零
⑨ 通过查询资料发现,全局变量数据读取时一定要进行关中断处理
⑩ 通过调试发现是定时器中断中执行的程序时间太长,如果把程序中的浮点数计算函数屏蔽掉就可以正常的工作,具体原因待查。
⑾ 把浮点数计算函数修改成任务,并且加个信号量,有定时器发送信号量,接收到信号量,函数就开始计算,仍然无法实现
⑿⒀⒁⒂⒃⒄⒅⒆⒇
浙公网安备 33010602011771号