问题描述
我正在为大学开展一个 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.0、FreeRTOS v202104.00 和 SW-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)”。
[]
- 点击
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}
按钮。
- 编辑
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}
- 编辑 GNU 链接器命令行模式并在
${command} ${flags} -mfloat-abi=hard ${output_flag}${output} ${inputs}
:>br/> 之后添加-mfloat-abi=hard
选项${flags}
- 编辑 GCC 链接器库:将
${command} ${flags} -mfloat-abi=hard ${output_flag}${output} ${inputs}
添加到libdriver.a
选项,将-l
添加到${workspace_loc:/${ProjName}/driverlib}
选项,然后单击-L
按钮。
- 构建您的项目 - 构建时应该没有任何错误。
- 通过运行您的项目来刷新它。
就我而言,我不得不停止项目并按下开发板 Apply and close
按钮才能启动程序。
最后,LED 应开始每 200 毫秒闪烁一次。
“清理”项目后,项目中文件的完整列表最终应为:
reset