傻大方


首页 > 知识库 > >

移植|移植μCOSII中英文翻译资料( 二 )


按关键词阅读: 移植 COSII 资料 翻译 中英文


这是通过为OS_STK声明恰当的C数据类型来实现的 。
如果处理器的堆栈是32位的 , 那么就应该将OS_STK声明:为:unsigned int,所有的任务堆栈都必须声明使用OS_STK作为它的数据类型 。
用户需要做的只是查阅编译器文档 , 找出对应于C/OS-II的标准的C的相应数据类型 。
OS_CPU.H , OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()像其它的实时内核一样 , C/OS-II需要先关中断再处理临界段代码 , 并且在处理完毕后再重新开中段 。
这就能够保证临界段代码免受多任务或中断服务子程序的破坏 。
通 。

9、常每个处理器都会提供一定的汇编指令来开关中断 , C编译器必须有一定的机制直接从C语言中执行这些操作 。
有些编译器允许在C源代码中直接加入汇编语句 , 这就使得插入处理器指令来开关中断变的容易 , 有些其它的编译器提供语言扩展功能 , 可以直接从C语言中开关中断 。
为了隐藏编译器厂商提供的不同实现方法 , 以增加可移植性 , C/OS-II定义了2个宏 , 用来关开中断:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL() , 如T1:它们都是成对出现的 , 分别加在临界段代码的前面和后面;C/OS-II Service FunctionOS_ENTER_CRITICAL();
/*临界段代码*/OS_EXIT 。

10、_CRITICAL();
T1方法一:实现OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()这两个宏的这种方法是最简单的方法 , 在中调用处理器指令关中断 , 以及在中调用相应处理器指令开中断;但是这个过程还存在小小的问题:如果在禁止中断的情况下调用C/OS-II函数 , 那么从C/OS-II函数返回时 , 中断可能会变成允许的了 。
而实际上如果调用C/OS-II之前中断是关掉的希望从C/OS-II函数返回时 , 希望中断还是关掉的 。
在这种情况下 , 仅靠这种方法是不适宜的 。
方法二:执行OS_ENTER_CRITICAL()时 , 先将中断状态保存到堆栈中 , 然后关中断;而当执行OS_EXIT_CRI 。

11、TICAL()时 , 再从堆栈中恢复原来的中断开关状态 。
如果用这种方法 , 那么不管用户是在中断禁止 , 还是中断允许的情况下调用C/OS-II的功能函数 , 调用后都不会改变中断状态 。
应用程序可以调用OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL() , 以保护临界段代码;但是 , 在使用这种方法时需特别小心 , 因为如果在调用像OSTimeDly()之类的功能函数之前就关掉了中断 , 应用程序就会崩溃 。
发生这种情况的原因是 , 任务被挂起 , 知道延迟时间到 , 而中断是关掉的 。
OSTimeDly()实际上是依靠时钟节拍实现中断的 , 而因为中断是关掉的 , 程序不可能获得时钟节拍中断 。
明显的 , 所有的PEND调用都 。

12、会涉及到这个问题 , 需十分小心 。
一个通用的办法是 , 应该在中断允许的情况下调用C/OS-II的系统功能函数 。
OS_CPU.H, OS_STK_GROWTH绝大多数微处理器和微控制器的堆栈都是从上往下递减的 , 但是也有某些处理器使用的是相反的方式 , C/OS-II被设计成对这两种情况都可以处理 , 只要再用配置常数OS_STK_GROWTH指定堆栈的方向就可以了:置OS_STK_GROWTH为0 , 表示堆栈从下(低地址)往上(高地址)递增:置OS_STK_GROWTH为1 , 表示堆栈从上(高地址)往下(低地址)递减 。
OS_CPU.H, OS_TASK_SW()OS_TASK_SW()是一个宏 , 是在C/OS- 。

13、II从低优先级任务切换到高优先级任务时须用到的 。
OS_TASK_SW()总是在任务级代码中被调用 。
另一个函数OSIntExit()用在中断服务子程序ISR中 。
任务切换只是简单地将处理器的寄存器保存到将被挂起的任务的堆栈中 , 并且从堆栈中恢复要运行的更高优先级的任务 。
在C/OS-II中 , 处于就绪态任务的堆栈结构看起来就像刚刚发生过中断一样 , 所有的寄存器都保存在堆栈中 。
换句话说 , C/OS-II要运行处于就绪态的任务必须要做的事是 , 从任务堆栈中恢复所有的寄存器 , 并且执行中断返回指令 。
为了任务调度 , 可以通过执行OS_TASK_SW()模仿中断的产生 。
绝大多数处理器会提供软中断或指令陷阱来完成这项功能 。
中 。

14、断服务子程序或指令陷阱处理函数(也叫做异常处理函数)的中断向量地址必须指向汇编语言函数OSCtxSw() 。
例如 , 在Intel或者AMD80X86处理器上可以使用INT指令 , 但是中断向量必须指向OSCtxSw() 。
有些处理器如Z80 , 并不提供软中断机制 。
在这种情况下需要想办法将堆栈结构设置成与软中断发生后的堆栈结构一样 。
在OS_TASK_SW()函数中调用OSCtxSw() , 而不是将某个中断向量指向OSCtxSw() 。


来源:(未知)

【学习资料】网址:/a/2021/0406/0021864430.html

标题:移植|移植μCOSII中英文翻译资料( 二 )


上一篇:2021|2021年公司办公室文员办公室实习报告范文

下一篇:农村信用社|某农村信用社信息科技风险管理经验交流