freeRTOS移植——初步分析

基于之前的分析,freeRTOS的移植主要集中在以下部分,

·       中断管理,包括ISR的配置、中断的关闭和开启等。

·       TASK切换处理,包括触发TASK切换、TASK切换的出栈和压栈操作等。

·       freeRTOS的基本配置和可选配置

·       Heap管理,

它们对应的源文件如下

·       portable.h,申明了中断管理和TASK切换管理相关的函数申明,用户可以自行增减

·       freeRTOS_Config.h,定义了freeRTOS的各类配置的宏,用于可以根据需要进行配置

·       Heap_X.c,X=1~5,用户可以自行选择freeRTOS提供的heap模型,也可以自行开发

 

移植之前必须清楚待移植嵌入式系统的硬件架构,尤其是CPU和存储器的相关细节。后边将一一提到。实际上freeRTOS需要移植的必要代码都已经在portable.h中声明(不含freeRTOS_Config.h配置的可选功能),我们只需要按照该文件填写好对应的宏和函数即可。

以下将以freeRTOS官网上给出的基于ZYNQ_ZC702的工程,对一些常见的需要移植的代码进行分析。

初始化Task Stack

对应函数声明强制如下,

StackType_t*pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void*pvParameters )

其在freeRTOS创建TASK时被调用,用于初始化TASK的STACK,细节参考API函数xTaskCreate()、xTaskCreateStatic()、xTaskCreateRestricted和xTaskCreateRestrictedStatic()。

该函数的处理十分简单,实际就是压栈过程,但寄存器的取值完全用用户确定,但是需要注意以下几点

·       寄存器压栈的顺序完全由用户确定,一般是建议按照寄存器的类型和编号来确定,以便于维护

·       Stack Address Register对应的栈内位置存放TASK入口函数地址

·       TASK入口函数的入参按照CPU要求存放在相应寄存器对应的栈内位置——一般而言,编译器会指定某些寄存器专门用于存放函数入参。

·       TASK入口函数的返回值初始化为一特定值,按照CPU要求存放在相应今存其对应的栈内位置——一般而言,编译器会指定某一寄存器专门用于存放函数返回值。

·       压栈之前先想栈内写入一些特殊值,可用于检测栈是否被异常改写。

前两点需要用户查询CPU相关硬件手册,是必须做的。后两者并不强制要求,但是在实际移植中常常用到,可以用来检测OS崩溃。

若业务代码没有频繁创建TASK,处于便于维护的考虑,建议用C语言实现。

 

以下为freeRTOS官网提供的部分代码,可见其认为栈是向下生长的,按照R15到R0的顺序进行入栈的,出栈时必须保证这样的顺序。

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值