freeRTOS在28388 CM核上的移植

TI-28388 DSP有2个C28x核和一个CM核(ARM cortex-M4),都可以运行TI官方提供的SYS/BIOS操作系统,本文介绍在CM核上移植freeRTOS的过程,并通过freeRTOS控制开发板上的一个led。

一、准备材料

  1. TMDSCNCD28388D controlCARD评估板
  2. CCS v10.2.0
  3. C2000Ware_3_04_00_00
  4. freeRTOSv9.0.0
    下载地址:https://sourceforge.net/projects/freertos/files/FreeRTOS/V9.0.0/

二、导入工程

导入C2000Ware中的led工程,在此工程上移植freeRTOS:
\ti\c2000\C2000Ware_3_04_00_00\driverlib\f2838x\examples\c28x_cm\led

三、复制freeRTOS文件

  1. 在工程led_ex1_c28x_cm_blinky_cm下新建freertos目录
  2. 复制FreeRTOSv9.0.0\FreeRTOS\Source下的所有.c文件到新建的freertos目录下。
  3. 将FreeRTOSv9.0.0\FreeRTOS\Source下的include文件夹复制到freertos目录下。
  4. 将FreeRTOSv9.0.0\FreeRTOS\Source\portable\CCS\ARM_CM4F目录下的3个文件复制到freertos目录下。
  5. 复制FreeRTOSv9.0.0\FreeRTOSv9.0.0\FreeRTOS\Source\portable\MemMang下的heap_4.c到freertos目录下。
  6. 复制FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_M4F_MSP432_LaunchPad_IAR_CCS_Keil下的FreeRTOSConfig.h到freertos目录下。

整个led工程目录如下图所示:
在这里插入图片描述

四、CCS设置

1.在led_ex1_c28x_cm_blinky_cm工程属性中增加包含路径:
在这里插入图片描述
2. 将Processor Options -> Specify point support设置为FPv4SPD16

五、修改配置文件FreeRTOSConfig.h

  1. 屏蔽driverlib.h
    //#include <driverlib.h>

  2. 定义CPU频率
    #define configCPU_CLOCK_HZ (125000000)//MAP_CS_getMCLK()

  3. 屏蔽以下几个选项,这样暂时不需要写应用层的回调函数:
    #define configUSE_TICKLESS_IDLE 0
    #define configUSE_IDLE_HOOK 0
    #define configUSE_TICK_HOOK 0
    #define configUSE_MALLOC_FAILED_HOOK 0
    #define configCHECK_FOR_STACK_OVERFLOW 0

  4. 配置堆空间大小为10k
    #define configTOTAL_HEAP_SIZE ( ( size_t ) ( 10 * 1024 ) )

六、修改中断服务函数

led工程中,SVC, PendSV和Systick三个中断的服务函数默认都为defaultISR,将其改为freeRTOS对应的函数:

//startup_cm.c,
// 三个函数是在port.c用汇编实现的
extern void vPortSVCHandler(void);
extern void xPortPendSVHandler(void);
extern void xPortSysTickHandler(void);
...
#endif
{
    (void (*)(void))((uint32_t)&__STACK_END),
                                            /* The initial stack pointer */
    resetISR,                               /* The reset handler         */
    nmiISR,                                 /* The NMI handler           */
    faultISR,                               /* The hard fault handler    */
    defaultISR,                             /* The MPU fault handler     */
    defaultISR,                             /* The bus fault handler     */
    defaultISR,                             /* The usage fault handler   */
    0,                                      /* Reserved                  */
    0,                                      /* Reserved                  */
    0,                                      /* Reserved                  */
    0,                                      /* Reserved                  */
    vPortSVCHandler,                             /* SVCall handler            */
    defaultISR,                             /* Debug monitor handler     */
    0,                                      /* Reserved                  */
    xPortPendSVHandler,                             /* The PendSV handler        */
    xPortSysTickHandler,                             /* The SysTick handler       */

七、新建led控制任务

在led_ex1_c28x_cm_blinky_cm.c中新建一个控制led的任务,并启动freeRTOS调度器。

//
// Included Files
//
#include "driverlib_cm.h"
#include "cm.h"

#include "freeRTOS.h"
#include "task.h"

void led1_task(void)
{
    static int iTaskCt = 0;
    while(1)
    {
        iTaskCt++;
        GPIO_writePin(DEVICE_GPIO_PIN_LED2, 0);
        vTaskDelay(50);//configTICK_RATE_HZ配置为100,1个tick为10ms,50=500ms
        GPIO_writePin(DEVICE_GPIO_PIN_LED2, 1);
        vTaskDelay(50);
    }
}
//
// Main
//
void main(void)
{
    BaseType_t xReturn = pdPASS;

    //
    // Initialize device clock and peripherals
    //
    CM_init();

    //
    // Initialize GPIO and configure the GPIO pin as a push-pull output
    //
    // This is configured by CPU1

    xReturn = xTaskCreate((TaskFunction_t)led1_task,
                          (const char*)"led1_task",
                          (uint16_t)512,
                          (void*)NULL,
                          (UBaseType_t)1,
                          (TaskHandle_t*)NULL);

    if(xReturn != pdPASS)
        return;

    vTaskStartScheduler();

    while(1){};
}

八、下载验证

将CPU1和CM程序分别下载到开发板,可以发现LED2按1Hz频率闪烁,freeRTOS中的全局变量xTickCount也按预期的100Hz变化,说明移植成功。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值