- 打卡等级:初来乍到
- 打卡总天数:5
- 最近打卡:2025-04-30 07:46:22
荣誉版主
- 积分
- 2319
|
发表于 2024-5-11 09:07:29
|
显示全部楼层
本帖最后由 tzz1983 于 2024-5-11 09:21 编辑
使用中断,和祼机完全一样, (就是以前是要在中断里 OSIntNesting++ 和 OSIntExit(), 现在不需要了)
中断里调用OS服务,分两种情
1. 原uC/OS-II中的通用服务, 即原本就是可任务调用也可中断调用的服务,仍可直接在中断里直接使用。
2.针对所有需要中断调用并且会引起任务切换的OS服务,移植版本提供了额外的中断调用版本,以原名函数+FROM_ISR结尾。
这一点和FreeRTOS使用规则是一致的。
具体可以看文件中的说明文档:
中断调用OS服务的注意事项:
* 有许多OS服务是不可以在中断例程中调用的,
* 原版的uCOS-II提供了OSIntNesting值来判断,
* 可以检测到用户的错误调用,从而提前返回一个错误码.
* 移植后的uCOS-II彻底取消了OSIntNesting
* 所以需要用户自行甄别哪些OS服务是不可以在中断例程中调用的( 比如OSTimeDly(),OSxxPend() 就是不可以在中断服务里调用的 )
* 如何判断一个服务是否可以在中断例程中调用? 方法是: 通过查看原码,如果该服务不会返回中断调用错误码,
* 同时也不会引起任务切换,就是通用服务,即->可以任务级调用,也可中断级调用. 否则不可中断调用.
* 针对所有需要中断调用并且会引起任务切换的OS服务,移植版本提供了额外的中断调用版本,以下是新增中断服务的函数.
INT8U OSTaskSuspend_FROM_ISR (INT8U prio)FunctionProperties;
INT8U OSTaskResume_FROM_ISR (INT8U prio)FunctionProperties;
INT8U OSTaskChangePrio_FROM_ISR (INT8U oldprio,INT8U newprio)FunctionProperties;
INT8U OSTimeDlyResume_FROM_ISR (INT8U prio)FunctionProperties;
INT8U OSSemPendAbort_FROM_ISR (OS_EVENT *pevent, INT8U opt, INT8U *perr)FunctionProperties;
INT8U OSSemPost_FROM_ISR (OS_EVENT *pevent)FunctionProperties;
OS_FLAGS OSFlagPost_FROM_ISR (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U opt, INT8U *perr)FunctionProperties;
INT8U OSMboxPostOpt_FROM_ISR (OS_EVENT *pevent, void *pmsg, INT8U opt)FunctionProperties;
INT8U OSMboxPost_FROM_ISR (OS_EVENT *pevent, void *pmsg)FunctionProperties;
INT8U OSMboxPendAbort_FROM_ISR (OS_EVENT *pevent, INT8U opt, INT8U *perr)FunctionProperties;
INT8U OSQPendAbort_FROM_ISR (OS_EVENT *pevent, INT8U opt, INT8U *perr)FunctionProperties;
INT8U OSQPost_FROM_ISR (OS_EVENT *pevent, void *pmsg)FunctionProperties;
INT8U OSQPostFront_FROM_ISR (OS_EVENT *pevent, void *pmsg)FunctionProperties;
INT8U OSQPostOpt_FROM_ISR (OS_EVENT *pevent, void *pmsg, INT8U opt)FunctionProperties;
有一定RTOS功底的应该是很好上手的。
这里不多说了,本来就是打算自己用的,我没有精力去搞宣传和教化。
学这个东西多半还是要靠自己悟的,啃代码就是最好的老师,谁学RTOS是靠人教会的?
|
|