【问题标题】:How to run FreeRTOS on TM4C129EXL? [closed]如何在 TM4C129EXL 上运行 FreeRTOS? [关闭]
【发布时间】:2021-07-17 15:41:55
【问题描述】:

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

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

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

【问题讨论】:

    标签: c http freertos texas-instruments coap


    【解决方案1】:

    您没有具体说明是否对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.zipD:\

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

    • 启动 CCS

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

    []

    • 点击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
      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
    • D:\FreeRTOSv202104.00\FreeRTOS\Source中存在的所有.c文件复制到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, GPIO_PIN_0, 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:将默认中断处理程序替换为数组g_pfnVectors[]中的FreeRTOS之一。
      原代码:
      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
        0,                                      // Reserved
        0,                                      // Reserved
        IntDefaultHandler,                      // SVCall handler
        IntDefaultHandler,                      // Debug monitor handler
        0,                                      // Reserved
        IntDefaultHandler,                      // The PendSV handler
        IntDefaultHandler,                      // The SysTick handler
    

    结果代码:

    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
        0,                                      // Reserved
        0,                                      // Reserved
        vPortSVCHandler,                        // SVCall handler
        IntDefaultHandler,                      // Debug monitor handler
        0,                                      // Reserved
        xPortPendSVHandler,                     // The PendSV handler
        xPortSysTickHandler,                    // The SysTick handler
    
    • 编辑 GCC 编译器目录的项目属性,并添加以下目录:
      ${workspace_loc:/${ProjName}/FreeRTOS-Kernel/include}
      ${workspace_loc:/${ProjName}/FreeRTOS-Kernel/portable/GCC/ARM_CM4F}
      ${workspace_loc:/${ProjName}
      ${workspace_loc:/${ProjName}/driverlib}
      并单击Apply and close 按钮。

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

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

    • 编辑 GCC 链接器库:将 libdriver.a 添加到 -l 选项,将 ${workspace_loc:/${ProjName}/driverlib} 添加到 -L 选项,然后单击 Apply and close 按钮。

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

    就我而言,我必须停止项目并按下板子上的reset按钮才能启动程序。

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

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

    Folder PATH listing for volume DATA
    Volume serial number is 0E12-BCA2
    D:.
    |   .ccsproject
    |   .cproject
    |   .project
    |   blinky.c
    |   FreeRTOSConfig.h
    |   main.c
    |   tm4c1294ncpdt.lds
    |   tm4c1294ncpdt_startup_ccs_gcc.c
    |   
    +---.settings
    |       org.eclipse.cdt.codan.core.prefs
    |       org.eclipse.cdt.debug.core.prefs
    |       org.eclipse.core.resources.prefs
    |       
    +---Debug
    |   |   ccsObjs.opt
    |   |   makefile
    |   |   objects.mk
    |   |   sources.mk
    |   |   subdir_rules.mk
    |   |   subdir_vars.mk
    |   |   TM4C129EXL-FreeRTOS.map
    |   |   
    |   +---driverlib
    |   |       subdir_rules.mk
    |   |       subdir_vars.mk
    |   |       
    |   \---FreeRTOS-Kernel
    |       |   subdir_rules.mk
    |       |   subdir_vars.mk
    |       |   
    |       \---portable
    |           +---GCC
    |           |   \---ARM_CM4F
    |           |           subdir_rules.mk
    |           |           subdir_vars.mk
    |           |           
    |           \---MemMang
    |                   subdir_rules.mk
    |                   subdir_vars.mk
    |                   
    +---driverlib
    |       adc.h
    |       aes.h
    |       can.h
    |       comp.h
    |       cpu.h
    |       crc.h
    |       debug.h
    |       des.h
    |       eeprom.h
    |       emac.h
    |       epi.h
    |       flash.h
    |       fpu.h
    |       gpio.h
    |       hibernate.h
    |       i2c.h
    |       interrupt.h
    |       lcd.h
    |       libdriver.a
    |       mpu.h
    |       onewire.h
    |       pin_map.h
    |       pwm.h
    |       qei.h
    |       rom.h
    |       rom_map.h
    |       rtos_bindings.h
    |       shamd5.h
    |       ssi.h
    |       sw_crc.h
    |       sysctl.h
    |       sysexc.h
    |       systick.h
    |       timer.h
    |       uart.h
    |       udma.h
    |       usb.h
    |       watchdog.h
    |       
    +---FreeRTOS-Kernel
    |   |   croutine.c
    |   |   event_groups.c
    |   |   list.c
    |   |   queue.c
    |   |   stream_buffer.c
    |   |   tasks.c
    |   |   timers.c
    |   |   
    |   +---include
    |   |       atomic.h
    |   |       croutine.h
    |   |       deprecated_definitions.h
    |   |       event_groups.h
    |   |       FreeRTOS.h
    |   |       list.h
    |   |       message_buffer.h
    |   |       mpu_prototypes.h
    |   |       mpu_wrappers.h
    |   |       portable.h
    |   |       projdefs.h
    |   |       queue.h
    |   |       semphr.h
    |   |       StackMacros.h
    |   |       stack_macros.h
    |   |       stdint.readme
    |   |       stream_buffer.h
    |   |       task.h
    |   |       timers.h
    |   |       
    |   \---portable
    |       +---GCC
    |       |   \---ARM_CM4F
    |       |           port.c
    |       |           portmacro.h
    |       |           
    |       \---MemMang
    |               heap_4.c
    |               
    \---inc
            asmdefs.h
            hw_adc.h
            hw_aes.h
            hw_can.h
            hw_ccm.h
            hw_comp.h
            hw_des.h
            hw_eeprom.h
            hw_emac.h
            hw_epi.h
            hw_fan.h
            hw_flash.h
            hw_gpio.h
            hw_hibernate.h
            hw_i2c.h
            hw_ints.h
            hw_lcd.h
            hw_memmap.h
            hw_nvic.h
            hw_onewire.h
            hw_pwm.h
            hw_qei.h
            hw_shamd5.h
            hw_ssi.h
            hw_sysctl.h
            hw_sysexc.h
            hw_timer.h
            hw_types.h
            hw_uart.h
            hw_udma.h
            hw_usb.h
            hw_watchdog.h
            tm4c1294ncpdt.h
        
    

    【讨论】:

    • @Omegon:作为新用户,建议阅读这篇文章:What should I do when someone answers my question?
    • 嘿弗兰特,感谢您的快速回答,我不知道有一个适用于 FreeRTOS 的 Tiva C 示例。如果我尝试编译这个例子,我会得到一些磨损的错误,我认为这不会帮助你在这一点上回答我的问题。关于我应该使用的编译器或不编译示例 ccs 项目的其他原因有什么需要了解的吗?
    • @Omegon:您使用的是 Windows 版本的 Code Composer Studio 还是 Linux 版本?您尝试构建 FreeRTOS 示例的 Code Composer Studio 的确切版本是什么?使用 Code Composer Studio 是您的任务的绝对要求,还是只是您个人的选择?此外,您没有回答您应该使用的 FreeRTOS 版本:这是一个非常重要的信息,因为据我所知,演示使用的是 FreeRTOS 7.0.2。
    • 感谢您提供非常好的答案,CCS 是一项要求,我使用的是 10.1 版本。我认为 RTOS 版本并不重要。我会尝试你的指示,我会在这里添加评论。谢谢。
    • @Omegon:有更新吗?谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 2021-04-01
    • 2020-12-08
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多