UCOS使用总结
1.UCOS 是抢占式系统,换句话来说,优先级高的能够被准时执行,优先级低的很容易被高优先级抢占,导致执行任务延迟。
2.UCOS一般为64个优先级,有些可以到256,其实一般开发就几个任务,任务多了更不好把控。很多时候都尽量少的开辟新的任务,因为这样可以避免开辟更多的栈,
3.目前而言使用的QP,只用到了消息队列,其它信号量和事件都没有使用,无论是消息队列和信号量和事件都是任务之间通讯使用的,也就是书上说的同步,同步说法个人认为搞的太过抽象。不方面初学者理解。
4.任务调度,在循环中为OSSched,在中断中是退出中断后调用红OSIntExit,在这个函数中判断中断嵌套是不是执行完,执行完就执行一次调度,OSTimeTick 是针对OSTimeDly,在这个函数中对应任务的一个计数器减。
5.UCOS 默认开启空闲任务,这个任务一般不适用,我一般用来喂看门狗。
UCOS CPU利用率显示
UCOS中开辟一个状态任务,其实就是定时去 看空闲计数器执行了多少次。
一个大任务启动,然后调用OSStatInit,这个函数其实就是执行一个任务延时,然后读取这个时间段 空闲任务计数器的个数。
以此来作为后续 计算CPU利用率的分母,后面执行程序,就按照这个定时读取空闲计数器个数,因为一旦有任务执行,空闲任务势必会被抢占,也就是得不到执行。
cortex m0 使用理解
一般m0 有R0 到 R15
R0-R7为低位寄存器,R8-R12为高位寄存器。
R13为堆栈寄存器。
R14为LR寄存器
R15为PC寄存器
XPSR 中很重要的低位数据,表示中断执行的函数号。这个东西意思,单片机执行中断,在那个中断服务函数中,尤其是中断嵌套中,就可以清晰的看到在那个中断执行中。这个寄存器高为是状态寄存器,表示当前执行计算的一些状态,类似51中的PSW,
PRIMASK,这个寄存器的最低位就是全局中断的开关,在OS中一般是保持这个寄存器,然后最后恢复这个寄存器。
无论在函数前面是否开启全局中断,都是在恢复PRIMASK的值,这样就不用粗暴的开关中断,因为你不知道函数是不是在前面就关闭了全局中断,然后您执行一次临界台操作又把全局中断开启了。
arm V6 m只有四个优先级,默认栈使用的MSP,无论是主程序还是中断都使用的MSP,在主循环显示的thread模式,中断中是handle模式,我犯了过一次错误就是在中断中执行了低功耗操作,但是我不知道,为什么呢,因为我用的老的ucos 任务切换的过程没有调用pendsv操作,都是手动直接切换,这个导致很多时候函数都是在handle模式中。
在中断中执行低功耗操作,要想唤醒,要让配置的唤醒中断源大于当前中断。否则唤不醒。
中断执行硬件自动压栈顺序
消息队列
创建消息队列,在UCOS中使用事件管理,Event.
OSQPend
OSQPost()
Post过后 置位事件所属任务的优先级。然后设置调度,因为这个函数是在中断中执行,软中断需要等待中断完执行才能被执行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)