UCOSii(六)——移植
来源:互联网 发布:淘宝买鱼雷怎么搜索 编辑:程序博客网 时间:2024/05/29 10:12
一、前言
UCOSii官方已经提供了许多移植范例,在这种情况下自己移植UCOSii是一种不经济的做法。但为了了解一个RTOS在移植时面临的兼容性问题,知道如何移植UCOSii依然是有必要的。
那么,RTOS在编译和运行时,在不同的chip上,会面临哪些问题呢?
编译类问题
不同的芯片可能会使用不同的编译器,而不同的编译在许多处理细节上会有所不同。比如有些编译器会将函数行参推入堆栈,而另外一些则会使用寄存器传递行参以加快速度。
芯片结构类问题
芯片的工作模式是16位还是32位?堆栈向下生长还是向下生长?如何产生时钟节拍?
汇编代码
有些情况下必须使用汇编来编写程序,一是这样可以使得一个经常被调用的子程序具有极高的效率。二是C语言不提供一些类似入栈、出栈这样的操作,一些寄存器的访问不得不通过汇编来执行。
二、移植
上图可以一览在移植过程中相关的文件。只有处理器相关的代码,才是移植中需要改动的。也就是OS_CPU.H,OS_CPU_A.ASM,OS_CPU_C.C,接下来是分析它们各自包含哪些内容。
移植相关文件即内容:
2.1 OS_CPU.H
如上图所示,OS_CPU.H首先要定义一些数据类型,这一般都没有多大的改动。
OS_STK和OS_STK_GROWTH要定义出系统堆栈的大小和堆栈的生长方向。
OS_ENTER_CRITICAL() 和OS_EXIT_CRITICAL()要定义系统开关中断的方法。
OS_CRITICAL_METHOD定义在以上开关中断前,是否需要保存一些寄存器的值。
OS_TASK_SW()定义系统软中断的方法,用以进行任务调度。
2.2 OS_CPU_A.ASM
OS_CPU_A.ASM包含的是四个汇编函数,由于它们需要操作堆栈,所以必须用汇编编写。
OSStartHighRdy()运行当前优先级最高的任务,需要恢复堆栈。
OSCtxSw()执行任务级别的切换,先保存当前寄存器,再恢复新任务的寄存器。
OSIntCtxSw()执行中断里的任务切换。这里有一个特别需要注意的地方,一旦决定要保存哪些寄存器的值,在恢复任务环境时,必须要将堆栈指针调整到正确的问题。
OSTickISR()产生时钟节拍。
2.3 OS_CPU_C.C
OSTaskStkInit()用于在任务被创建时,初始化堆栈。它会返回堆栈指针,这样OSTaskCreate()和 OSTaskCreateExt()就会将Tcb存在栈里。
其他的Hook函数是一些钩子,可以让用户对OS进行一些扩展,一般只声明即可。
三、结语
RTOS是非常棒的工具,它使用户可以灵活利用信号量、邮箱、消息队列等工具,实现任务的通信与同步。这样,程序员可以利用RTOS的特性快速设计出自己需要的系统结构,而不用在任务调度的结构性代码上耗费时间。虽然国内UCOSii使用得比较多,但在国外似乎freertos更火一些,毕竟开源和免费嘛。等过段时间,再来分析下freertos的特性吧。
- UCOSii(六)——移植
- ucosii移植
- UCOSII移植
- 移植ucosII到STM32F103ZE(一)
- 移植ucosII到STM32F103ZE(二)
- UCOSii(一)——系统初始化
- UCOSii(三)——时间管理
- UCOSii(五)——内存管理
- stm32移植ucosII成功
- ucosII的移植
- stm32f4移植ucosii
- stm32f10x ucosii 移植要点
- uCosii移植51_STC12LE5A60S2
- ucosII移植:可重入代码
- UCOSII移植STM32f103操作过程
- UcosII移植之Stm32f107
- ucosii移植_0
- ucosii移植_1
- java之 ------ 可变参数和卫条件
- Java代码设计思想之静态工厂方法..
- 设计模式简单代码之Mediator模式(一)
- 文章标题
- 拉格朗日对偶问题
- UCOSii(六)——移植
- [jQuery] Cannot read property ‘msie’ of undefined错误的解决方法
- Android SAX解析XML
- 一切成功源于积累——20150608 欧美 连续12H 涨 单日2000点
- v assist vs2010
- 开源 java CMS - FreeCMS2.3 移动app生成信息数据
- ubuntu 安装 mysql
- 设计模式简单代码之Mediator模式(二)
- phaser 简单分享