|
之前学UC,用在STM32上,拿别人移植好了过来的程序跑了几个灯,就好久没动了,现在把前后台做的一个人机界面,把它弄进OS去,发现了几个问题,请教下各位大侠:
1、任务B中定义了一个较大的数组,用来对采集到的数据进行处理用的,有360B,而CM3的内核通用寄存器是16个,开始我吧任务B的堆栈设为64B,结果该任务一旦开跑之后挂起,就跑进HardFault去,也就是当机了。后来把堆栈设大了之后该任务可以挂起(还有BUG见问题2),现在不明白的是,任务中的变量是存储在堆栈中去的吗,而堆栈的设置只要大于CPU内核寄存器+变量大小就可以了呢?
2、这个也是最想不明白的,按常理来说两个没直接联系的东西影响对方了。现在有三个有可能关联的任务,任务A,B,C优先级分别是8,12,10,开始除了A都挂起了
任务A显示主菜单及相关的按键处理,一旦按下菜单1,任务B,任务C解挂,任务A自动挂起,C是采集数据用的1S读三次。任务B里面有个挂起延时的动作,OSTimeDly(),只要有这个动作存在,对18B20采集的温度就会偶尔失误了。但是即使我没有进入到任务B,在只有A运行的情况下,采集的数据也有误。 而只要把任务B里面OSTimeDly(),这个动作去掉,整个系统就都不会出现采集数据有误的情况。。 还有其他任务里出现OSTimeDly()也都正常!
18B20也不是刚开始用了,出现这种情况一般是某个函数读温度的时候,发生一个中断,中断里再次操作18B20,造成时序乱了的结果,但是在这里,我搞不清楚了,也许对这个OS还不熟悉吧,希望大家指点指点!! |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|