如何在 TM4C129EXL 上运行 FreeRTOS?

问题描述

我正在为大学开展一个 C 项目,其中 CoAP 服务器将托管在 TM4C129EXL 上。选择 FreeRTOS 操作系统尤为重要。不幸的是,我不得不得知德州仪器已停止支持 FreeRTOS。我没有选择切换到另一个操作系统。正是因为这个原因,我才求助于你。

我正在寻找在 TM4C129EXL 板上执行 Free RTOS 的示例程序。在最好的情况下,我会对 Code Composer Studio 项目感到高兴,因为这是我们在大学使用的 IDE。

如果您没有任何可用的示例代码,我很乐意收到有关 FreeRTOS 和 CoAP 当然参考 TM4C129EXL 的任何其他信息。

解决方法

您没有说明您是否对 FreeRTOS 版本有任何要求,但您可以:

  • 按原样使用 TI WEB 站点上提供的文件 SW-EK-TM4C1294XL-2.1.4.178.exe 中提供的演示 - 您可以在目录 examples\boards\ek-tm4c1294xl-boostxl-senshub\senshub_iot 中找到它
  • 将此示例作为使用更新版本 FreeRTOS 的基础:您只需将 FreeRTOS 源代码替换为最新版本,并且可能需要修改演示中的某些代码:某些函数名称/签名可能具有在主要版本之间发生了变化。

以下过程将逐步介绍如何使用第二种方法在 Windows 10 环境中使用 Code Composer Studio 10.3.0 和 FreeRTOS v202104.00 创建极简的 FreeRTOS 程序。您可能需要根据您的特定设置调整驱动器号,我使用 D: 出于本示例的目的..

  • 下载 Code Composer Studio 10.3.0FreeRTOS v202104.00SW-EK-TM4C1294XL-2.1.4.178.exe

  • 安装支持 Tiva-C MCU 系列的 Code Composer Studio。当提示输入工作区名称时,指定 D:\ti\workspace_v10

  • FreeRTOSv202104.00.zip 解压到 D:\

  • SW-EK-TM4C1294XL-2.1.4.178.exe 解压到 D:\SW-EK-TM4C1294XL-2.1.4.178

  • 启动 CCS

  • 使用菜单项 File/New/CCS Project,并创建一个“空项目(使用 main.c)”。

[Project creation wizzard]

  • 点击Finish按钮。
  • 创建以下目录:
    D:\ti\workspace_v10\TM4C129EXL-FreeRTOS\driverlib
    D:\ti\workspace_v10\TM4C129EXL-FreeRTOS\inc
    D:\ti\workspace_v10\TM4C129EXL-FreeRTOS\FreeRTOS-Kernel
    D:\ti\workspace_v10\TM4C129EXL-FreeRTOS\FreeRTOS-Kernel\include
    {{ 1}}
    D:\ti\workspace_v10\TM4C129EXL-FreeRTOS\FreeRTOS-Kernel\portable\GCC
    D:\ti\workspace_v10\TM4C129EXL-FreeRTOS\FreeRTOS-Kernel\portable\GCC\ARM_CM4F
  • D:\ti\workspace_v10\TM4C129EXL-FreeRTOS\FreeRTOS-Kernel\portable\MemMang 复制到 D:\SW-EK-TM4C1294XL-2.1.4.178\examples\boards\ek-tm4c1294xl-boostxl-senshub\senshub_iot\FreeRTOSConfig.h
  • 将所有 D:\ti\workspace_v10\TM4C129EXL-FreeRTOS 文件从 .h 复制到 D:\SW-EK-TM4C1294XL-2.1.4.178\driverlib
  • D:\ti\workspace_v10\TM4C129EXL-FreeRTOS\driverlib 复制到 D:\SW-EK-TM4C1294XL-2.1.4.178\driverlib\gcc\libdriver.a
  • 将所有 D:\ti\workspace_v10\TM4C129EXL-FreeRTOS\driverlib 文件从 .h 复制到 D:\SW-EK-TM4C1294XL-2.1.4.178\inc
  • D:\ti\workspace_v10\TM4C129EXL-FreeRTOS\inc 中存在的所有文件复制到 D:\FreeRTOSv202104.00\FreeRTOS\Source\include
  • D:\ti\workspace_v10\TM4C129EXL-FreeRTOS\FreeRTOS-Kernel\include 中存在的所有 .c 文件复制到 D:\FreeRTOSv202104.00\FreeRTOS\Source
  • D:\ti\workspace_v10\TM4C129EXL-FreeRTOS\FreeRTOS-Kernel 中的所有文件复制到 D:\FreeRTOSv202104.00\FreeRTOS\Source\portable\GCC\ARM_CM4F
  • D:\ti\workspace_v10\TM4C129EXL-FreeRTOS\FreeRTOS-Kernel\portable\GCC\ARM_CM4F 复制到 D:\FreeRTOSv202104.00\FreeRTOS\Source\portable\MemMang\heap_4.c
  • 编辑D:\ti\workspace_v10\TM4C129EXL-FreeRTOS\FreeRTOS-Kernel\portable\MemMang,并将其内容替换为:
D:\ti\workspace_v10\TM4C129EXL-FreeRTOS\main.c
  • 创建一个名为 #include "FreeRTOS.h" #include "task.h" extern void prvSetupHardware(); extern void main_blinky(); int main(void) { /* Configure the hardware ready to run the demo. */ prvSetupHardware(); main_blinky(); /* Don't expect to reach here. */ return 0; } void vApplicationStackOverflowHook( TaskHandle_t xTask,char *pcTaskName) { while(1) { } } 的新文件,内容如下:
D:\ti\workspace_v10\TM4C129EXL-FreeRTOS\blinky.c
  • 编辑 #include <stdbool.h> #include <stdint.h> #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "inc/hw_ints.h" #include "driverlib/debug.h" #include "driverlib/gpio.h" #include "driverlib/sysctl.h" #include "FreeRTOS.h" #include "task.h" #include "sysctl.h" static void prvLedToggleTask(); /* Priorities at which the tasks are created. */ #define mainTOGGLE_LED_PRIORITY ( tskIDLE_PRIORITY + 1 ) #define TOGGLE_LED_DELAY_MS 200 void main_blinky() { /* create task */ xTaskCreate( prvLedToggleTask,"LED",configMINIMAL_STACK_SIZE,NULL,mainTOGGLE_LED_PRIORITY,NULL ); /* Start the tasks and timer running. */ vTaskStartScheduler(); } static void prvLedToggleTask( void *pvParameters ) { // Remove compiler warning about unused parameter. */ ( void ) pvParameters; for( ;; ) { // // Turn on the LED. // GPIOPinWrite(GPIO_PORTN_BASE,GPIO_PIN_0,GPIO_PIN_0); // Wait a bit vTaskDelay( TOGGLE_LED_DELAY_MS); // // Turn off the LED. // GPIOPinWrite(GPIO_PORTN_BASE,0x0); // Wait a bit vTaskDelay( TOGGLE_LED_DELAY_MS ); } } uint32_t g_ui32SysClock; void prvSetupHardware() { // Configure PLL g_ui32SysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480),120000000); // // Enable the GPIO port that is used for the on-board LED. // SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION); // // Check if the peripheral access is enabled. // while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPION)) { } // // Enable the GPIO pin for the LED (PN0). Set the direction as output,and // enable the GPIO pin for digital function. // GPIOPinTypeGPIOOutput(GPIO_PORTN_BASE,GPIO_PIN_0); } :在包含 tm4c1294ncpdt_startup_ccs_gcc.c 的行之后添加以下行
static void IntDefaultHandler(void);

生成的代码应如下所示:

extern void xPortPendSVHandler(void);
extern void vPortSVCHandler(void);
extern void xPortSysTickHandler(void);
  • 编辑 void ResetISR(void); static void NmiSR(void); static void FaultISR(void); static void IntDefaultHandler(void); extern void xPortPendSVHandler(void); extern void vPortSVCHandler(void); extern void xPortSysTickHandler(void); :用数组 tm4c1294ncpdt_startup_ccs_gcc.c 中的 FreeRTOS 替换默认中断处理程序。
    原始代码:
g_pfnVectors[]

结果代码:

  void (* const g_pfnVectors[])(void) =
{
    (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)),// The initial stack pointer
    ResetISR,// The reset handler
    NmiSR,// The NMI handler
    FaultISR,// The hard fault handler
    IntDefaultHandler,// The MPU fault handler
    IntDefaultHandler,// The bus fault handler
    IntDefaultHandler,// The usage fault handler
    0,// Reserved
    0,// Reserved
    IntDefaultHandler,// SVCall handler
    IntDefaultHandler,// Debug monitor handler
    0,// The PendSV handler
    IntDefaultHandler,// The SysTick handler
  • 编辑 GCC 编译器目录的项目属性,并添加以下目录:
    void (* const g_pfnVectors[])(void) = { (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)),// Reserved vPortSVCHandler,// Reserved xPortPendSVHandler,// The PendSV handler xPortSysTickHandler,// The SysTick handler
    ${workspace_loc:/${ProjName}/FreeRTOS-Kernel/include}
    ${workspace_loc:/${ProjName}/FreeRTOS-Kernel/portable/GCC/ARM_CM4F}
    ${workspace_loc:/${ProjName}
    并点击 ${workspace_loc:/${ProjName}/driverlib} 按钮。

GCC Compiler include directories

  • 编辑 Apply and close 并删除以下行:
D:\ti\workspace_v10\TM4C129EXL-FreeRTOS\FreeRTOSConfig.h
  • 编辑 GCC 编译器命令行模式并在命令行模式中的 #define configGENERATE_RUN_TIME_STATS 1 #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() \ g_vulRunTimeStatsCountValue = 0ul #define portGET_RUN_TIME_COUNTER_VALUE() g_vulRunTimeStatsCountValue 后添加 -mfloat-abi=hard 选项:
    ${flags}

GCC Compiler Command-line pattern

  • 编辑 GNU 链接器命令行模式并在 ${command} ${flags} -mfloat-abi=hard ${output_flag}${output} ${inputs}:>br/> 之后添加 -mfloat-abi=hard 选项 ${flags}

GCC linker Command-line pattern

  • 编辑 GCC 链接器库:将 ${command} ${flags} -mfloat-abi=hard ${output_flag}${output} ${inputs} 添加到 libdriver.a 选项,将 -l 添加到 ${workspace_loc:/${ProjName}/driverlib} 选项,然后单击 -L 按钮。

GCC linker libraries options

  • 构建您的项目 - 构建时应该没有任何错误。
  • 通过运行您的项目来刷新它。

就我而言,我不得不停止项目并按下开发板 Apply and close 按钮才能启动程序。

最后,LED 应开始每 200 毫秒闪烁一次。

“清理”项目后,项目中文件的完整列表最终应为:

reset