FreeRTOS移植至s3c44b0

花了些时间,移植freertos。板子是44b0,略记之,以备忘。

 

 

1、   freertos,也有收费版本,OpenRTOS和SafeRTOS
   其主页为http://www.freertos.org/
    对于free版本,则为FreeRTOS,主要是这句话很吸引人
   “It is a popular, portable, open source, royalty free, mini Real Time Kernel - a free to download and free to deploy RTOS that can be used in commercial applications without any requirement to expose your proprietary source code. ”
    当然,对于收费版本,肯定有他们的好处。

2 FreeRTOS的下载地址为在sourceforge:http://sourceforge.net/projects/freertos/files/FreeRTOS/,最新版本是V6.1.1,可以下载.exe或.zip格式的文件,.exe应该是7z的压缩方式。

3  目前移植至s3c44b0,arm7级别。
   freeRTOS的移植比较简单,目前工程中已经包含了多个mcu的支持。可以从中找到相似的mcu做移植即可。如果用的mcu已经在支持之中,那就可以直接拿来用,可能会有一些小小的改动。不同mcu的移植主要在demo和source/portable目录下。此两目录有对应关系。demo中是为启动代码及跳到main函数相关,及一些第三方资源移植如uip,ufs等,demo/common目录下是一些api的使用例子,如任务间通信,任务调试之类。source/portable主要是完成rtos定时器设置,上下文切换,中断相关操作。

   因此,对于44b0(ADS),可以以demo/ARM7_LPC2129_Keil_RVDS目录为模板,因为rvds与ads的汇编方法比较一致,同是arm体系。新建目录,并命名为440,在完成startup.s文件的启动代码,可以从其他现有的44b0的启动代码,复制来即可,当然要自己要研究一下也是可以,主要是中断向量表,复制代码至ram,内存堆栈分配使用,设置arm不同工作模式的堆栈,及pll设置,并跳入c代码的main函数。


3.1   把source/portable目录下的,RVDS/ARM7_LPC21xx目录复制到44b0,并重命名为portable。
   修改port.c:
   去掉与44b0不相关的硬件代码,如定时器设置,中断设置等。prvSetupTimerInterrupt函数实现如下,启动freertos定时器,此处用到为timer0:


            static void prvSetupTimerInterrupt( void ) { pISR_TIMER0= (unsigned) vPreemptiveTick; Board_SetTimerTicks(0, configTICK_RATE_HZ); rTCON = rTCON & (~0xF) | 0x2; rINTMSK &= ~(BIT_TIMER0| BIT_GLOBAL ); rTCON = rTCON & (~0xF) | 0x9; //autoreload and start }
     增加
            void ARMDisableIntC(void) { rINTMSK|=BIT_GLOBAL; } void ARMEnableIntC(void) { rINTMSK&=~BIT_GLOBAL; }
        用于屏蔽/使能中断。

        把vPortEnterCritical中的__disalbe_irq换成ARMDisableIntC。把vPortExitCritical中的__enable_irq换成ARMEnableIntC

3.2 修改portASM.s文件
  先定义两个常量
  T0IR        EQU    0x1e00024  ;44b0 timer0 的中断寄存器
  T0MATCHBIT    EQU    (0x1<<13)  ;44b0 timer0的屏蔽位

  vPortYield中的SVC 0,这条指令在ads编译不通过。用swi 0指令代替,主要是产生swi中断,然后在swi中断中调用

vPortYieldProcessor。
   vPortYieldProcessor不用修改
   vPreemptiveTick修改,修改timer0的中断位清除即可,如下:
   MOV R0, #T0MATCHBIT                    ; Clear the timer event
   LDR R1, =T0IR
   STR R0, [R1]

   再在系统C代码的初始化中,加入处理swi中断,即:
   pISR_SWI = (unsigned) vPortYieldProcessor; //把vPortYieldProcessor函数地址赋经pISR_SWI

 

至此,一个基本的freertos已经移植完成。接下之后,就是创建任务,外围驱动的添加。 

你可能感兴趣的:(嵌入式软硬件)