UCOSii(六)——移植
2015-06-09 08:40
155 查看
一、前言
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的特性吧。相关文章推荐
- [jQuery] Cannot read property ‘msie’ of undefined错误的解决方法
- Android SAX解析XML
- Leetcode letter combination of a phone number
- 【前端福利】用grunt搭建自动化的web前端开发环境-完整教程
- 拉格朗日对偶问题
- 设计模式简单代码之Mediator模式(一)
- 大集合的资源的前端寻求
- Java代码设计思想之静态工厂方法..
- java之 ------ 可变参数和卫条件
- SSL证书必知必会之SSL证书类型
- Redshift扩容及踩到的坑
- Shell脚本编程初体验
- Shell脚本编程初体验
- Yii2—控制器(Controller)
- 从问题看本质: 研究TCP close_wait的内幕
- 动态规划--换零钱
- 百度音乐接口-——这可以基于在线音乐播放器来完成
- Yii2—视图(View)
- 进程创建
- Errors occurred during the build. Errors running builder 'JavaScript Validator' on project 'XXX'.