TI-28388 DSP有2個C28x核和一個CM核(ARM cortex-M4),都可以運作TI官方提供的SYS/BIOS作業系統,本文介紹在CM核上移植freeRTOS的過程,并通過freeRTOS控制開發闆上的一個led。
一、準備材料
- TMDSCNCD28388D controlCARD評估闆
- CCS v10.2.0
- C2000Ware_3_04_00_00
-
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檔案
- 在工程led_ex1_c28x_cm_blinky_cm下建立freertos目錄
- 複制FreeRTOSv9.0.0\FreeRTOS\Source下的所有.c檔案到建立的freertos目錄下。
- 将FreeRTOSv9.0.0\FreeRTOS\Source下的include檔案夾複制到freertos目錄下。
- 将FreeRTOSv9.0.0\FreeRTOS\Source\portable\CCS\ARM_CM4F目錄下的3個檔案複制到freertos目錄下。
- 複制FreeRTOSv9.0.0\FreeRTOSv9.0.0\FreeRTOS\Source\portable\MemMang下的heap_4.c到freertos目錄下。
- 複制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
-
屏蔽driverlib.h
//#include <driverlib.h>
-
定義CPU頻率
#define configCPU_CLOCK_HZ (125000000)//MAP_CS_getMCLK()
-
屏蔽以下幾個選項,這樣暫時不需要寫應用層的回調函數:
#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
-
配置堆空間大小為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變化,說明移植成功。