UCOS使用的细节问题汇总

        总结如下:

1、中断系统不要使用信号量这些东西;


2、任务A执行,若产生中断,中断服务函数执行,中断服务函数执行完中断返回,会产生任务调度,如果有高优先级任务B就绪,此时执行B而不会直接返回到A执行;


3、抢占式内核:在每个调度时机,运行优先级最高的那个;


4、任务挂起情况:主动挂起、延时函数调用、等待资源;


5、不要在定时器里面去等待资源,会导致当前CPU占用的情况下同时任务被挂起,CPU没法儿释放;


6、临界区保护的代码:
        OS_CRITICAL_ENTER()表示进入临界区
        OS_CRITICAL_EXIT()表示退出临界区
        选择进入临界区究竟是关中断还是调度器上锁,需要找到os_cfg.h中的宏定义 OS_CFG_ISR_POST_DEFERRED_EN:
当该宏定义为0时:屏蔽除NMI和fault外的所有中断
当该宏定义为1时:对调度器上锁
        注意:在调度器上锁期间严禁调用各种可能引起任务调度的函数,比如:睡眠延迟,阻塞等待信号量/事件标志组/多个内核对象等,否则可能导致内核崩溃。


7、调度器是针对 运行态 任务;


8、ucos的5个系统内部任务:
        优先级0:中断服务服务管理任务 OS_IntQTask()
        优先级1:时钟节拍任务 OS_TickTask()
        优先级2:定时任务 OS_TmrTask() --- 实际上就是ucos的软件定时器
        优先级OS_CFG_PRIO_MAX-2:统计任务 OS_StatTask()
        优先级OS_CFG_PRIO_MAX-1:空闲任务 OS_IdleTask()


9、ucos的软件定时器实际上就是一个内置任务(任务优先级为2),可以被硬件中断打断的(中断管理任务优先级为0);


10、时间轮转调度:OS_CFG_SCHED_ROUND_ROBIN_EN置1,创建任务可以设置每个任务的时间片,作用在同一优先级的任务,由滴答定时器去做任务切换;


11、ucos任务中调用不可重入操作(常见:标准IO、浮点计算、static变量、malloc/free),最好加上临界区保护;


12、为了使高优先级的任务不至于独占CPU,可以给其他优先级较低任务获取CPU使用权的机会,ucos中除空闲任务外的所有任务必须在合适的位置调用系统提供的延时函数;


13、ucos不支持同时等待 多个事件标志组 或 互斥信号量,支持同时等待 多个信号量 和 多个消息队列;等待多个内核对象,任意一个来临任务都会进入 就绪态 ;


14、优先级反转问题:为了等待 信号量资源 ,高优先级任务被低优先级任务阻塞,导致高优先级任务迟迟得不到调度,使得中优先级抢占到CPU。(高、中、低)
        优先级天花板(推荐):当线程(任务)申请某共享资源时,把该线程的优先级提升到可访问这个资源的所有线程中的最高优先级。这样,该线程不会被其他可能使用该临界资源的线程抢占,从而得到更快执行,更快地释放临界资源,释放后再将其降为原优先级。
        优先级继承:只有在高优先级需要使用被低优先级占用的资源时,临时提升低优先级任务的优先级,让低优先级任务能更快运行更早释放资源,释放后再将其降为原优先级。


15、上下文切换:CM3中,如果 OS 在某isr活跃时,尝试抢占该中断切入线程模式Thread mode(任务),将触犯用法 fault 异常:
        早期解决:只有在没有任何中断响应,才执行上下文切换。
        PendSV解决方案:PendSV异常会自动延迟上下文切换的请求,直到其它的ISR(中断服务)都完成了处理后才放行。为实现这个机制,需要把PendSV编程为最低优先级的异常,如果OS检测到某IRQ(中断请求)正在活跃并且被SysTick 抢占,它将悬起一个PendSV异常,以便缓期执行上下文切换,直到其它的ISR(中断服务)都完成了处理后才放行。

        我在自己实现RTOS过程中的处理:PendSV设置为最低优先级中断、Systick也设置为最低优先级中断。(Systick只需要判断是否需要产生上下文切换请求,实际切换PenSV去做)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值