第二章 开发环境搭建:工欲善其事,必先利其器
好,咱们正式开始动手。这一章,我带你把开发环境从头到尾捋一遍。说实话,很多初学者卡在第一步——环境没搭好,后面全是坑。我自己早年也吃过这个亏,装个IDE折腾半天,结果发现版本不对,又重来。所以这一章,咱们稳扎稳打。
2.1 英飞凌IDE的选择:AURIX Development Studio vs ModusToolbox
英飞凌目前主推两款IDE,你得先搞清楚用哪个。
| 特性 | AURIX Development Studio | ModusToolbox |
|---|---|---|
| 目标芯片 | AURIX TC2xx/TC3xx 系列 | PSoC、XMC、AIROC 等 |
| 编译器 | Tasking / GCC(自带) | GCC / ARMCC |
| 调试器 | 内置,支持MiniWiggler | 需单独配置 |
| 适合人群 | 汽车电子、工业控制老手 | 物联网、消费电子开发者 |
我个人习惯用 AURIX Development Studio。为什么?因为它开箱即用,Tasking编译器性能好,调试器也集成好了。你想想看,做FreeRTOS移植,最怕的就是编译器跟IDE不匹配,ADS帮你省了这一步。
2.2 安装AURIX Development Studio
去英飞凌官网下载最新版。注意,别下错了版本——ADS有Windows和Linux版,我建议用Windows,生态更全。
- 双击安装包,一路Next。但有个关键点:安装路径不要有中文。我曾经见过有人装在“D:\开发工具”下,结果编译报错,查了半天是路径编码问题。
- 安装过程中会提示你选择组件。默认全选就行,但如果你硬盘空间紧张,可以去掉“文档”和“示例工程”,这些后面可以单独下载。
- 安装完成后,第一次启动会提示你设置工作空间(Workspace)。我建议单独建一个文件夹,比如
D:\FreeRTOS_Workspace,别跟其他项目混在一起。
2.3 获取FreeRTOS源码
FreeRTOS源码现在托管在GitHub上。你直接搜“FreeRTOS/FreeRTOS”就能找到。但别急着点Download ZIP,我教你一个更专业的做法。
用Git克隆仓库:
git clone https://github.com/FreeRTOS/FreeRTOS.git --recurse-submodules
为什么要加 --recurse-submodules?因为FreeRTOS依赖一些子模块,比如FreeRTOS-Kernel、FreeRTOS-Plus等。如果不加这个参数,你下载的源码会缺东西。我刚开始做移植时,就因为这个浪费了半天。
下载完成后,目录结构大概是这样的:
FreeRTOS/
├── FreeRTOS-Kernel/ # 内核源码,核心!
├── FreeRTOS-Plus/ # 一些扩展组件(TCP/IP、FAT等)
├── Demo/ # 官方示例工程
└── Source/ # 一些工具脚本
我们真正需要的是 FreeRTOS-Kernel 这个目录。里面包含了所有任务调度、队列、信号量的实现。其他目录暂时用不到,但别删,以后可能会参考。
FreeRTOS-Kernel/tasks.c—— 任务管理核心FreeRTOS-Kernel/queue.c—— 队列与信号量FreeRTOS-Kernel/list.c—— 链表操作FreeRTOS-Kernel/portable/—— 移植层,这里放的是各个平台的适配代码
2.4 创建工程模板
好,现在IDE装好了,源码也拿到了。接下来咱们创建一个工程模板。这个模板以后可以反复用,省得每次移植都从头开始。
2.4.1 新建ADS工程
- 打开ADS,点击
File → New → AURIX Project。 - 输入工程名,比如
FreeRTOS_TC375。芯片型号选你手头的板子,我这边用的是TC375 Lite Kit。 - 选择编译器。我建议用 Tasking,因为它的优化做得好,而且跟ADS深度集成。GCC也行,但性能差一些。
- 点击Finish,ADS会自动生成一个基础工程,包含启动代码、链接脚本和main.c。
2.4.2 添加FreeRTOS源码
把FreeRTOS-Kernel目录复制到工程根目录下。然后在ADS里右键工程,选择 Properties → C/C++ Build → Settings,添加头文件路径:
${workspace_loc:/${ProjName}/FreeRTOS-Kernel/include}
${workspace_loc:/${ProjName}/FreeRTOS-Kernel/portable/GCC/Infineon/TC3_7}
注意,第二个路径是移植层。不同芯片的移植文件不一样。TC3xx系列用的是 portable/GCC/Infineon/TC3_7 这个目录。如果你用的是其他型号,得找对应的文件夹。
2.4.3 配置FreeRTOSConfig.h
这是FreeRTOS的灵魂文件。所有配置都在这里。我直接给你一个最小配置:
#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H
#define configUSE_PREEMPTION 1
#define configUSE_IDLE_HOOK 0
#define configUSE_TICK_HOOK 0
#define configCPU_CLOCK_HZ ( 300000000UL ) // TC375主频300MHz
#define configTICK_RATE_HZ ( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES ( 5 )
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 128 )
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 64 * 1024 ) )
#define configMAX_TASK_NAME_LEN ( 16 )
#define configUSE_16_BIT_TICKS 0
#define configIDLE_SHOULD_YIELD 1
#define configUSE_MUTEXES 1
#define configUSE_RECURSIVE_MUTEXES 1
#define configUSE_COUNTING_SEMAPHORES 1
#define configUSE_QUEUE_SETS 0
#define configUSE_TASK_NOTIFICATIONS 1
/* 中断配置 */
#define configKERNEL_INTERRUPT_PRIORITY 1
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 3
#endif /* FREERTOS_CONFIG_H */
这里有几个关键点:
configCPU_CLOCK_HZ一定要跟你的芯片实际主频一致。TC375默认是300MHz,但如果你改了PLL配置,这里也得改。configTOTAL_HEAP_SIZE我设了64KB。这个值取决于你的应用,如果任务多、队列多,就设大一点。- 中断优先级配置要小心。英飞凌的TC3xx中断优先级是0-255,数值越小优先级越高。FreeRTOS内核中断优先级一般设成1,系统调用中断优先级设成3。这个我后面会详细讲。
configMAX_SYSCALL_INTERRUPT_PRIORITY 设成了0,结果系统一跑就死机。后来查手册才发现,0是最高优先级,FreeRTOS不能屏蔽它。所以这个值至少设成1。
2.4.4 编写第一个任务
模板建好了,咱们写个简单的任务验证一下:
#include "FreeRTOS.h"
#include "task.h"
void vTask1(void *pvParameters)
{
while(1)
{
// 任务代码
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
int main(void)
{
// 硬件初始化(省略)
xTaskCreate(vTask1, "Task1", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
vTaskStartScheduler();
// 正常情况下不会执行到这里
while(1);
}
编译、下载、运行。如果一切正常,任务会每隔1秒执行一次。你可以用调试器观察任务状态。
2.5 工程模板的后续使用
这个模板建好之后,我建议你把它导出成一个归档文件。以后做新项目时,直接导入这个模板,改一下芯片型号和FreeRTOSConfig.h就行。省时省力。
导出方法:File → Export → General → Archive File,选上你的工程,生成一个zip文件。下次用的时候,File → Import → Existing Projects into Workspace,选这个zip就行。
- IDE选AURIX Development Studio,省心。
- FreeRTOS源码用Git克隆,别忘了子模块。
- 工程模板要包含FreeRTOS-Kernel和正确的移植层。
- FreeRTOSConfig.h是核心,配置错了系统跑不起来。
嗯,环境搭建就到这儿。下一章咱们开始真正动手移植——把FreeRTOS跑在TC375上。到时候我会带你一步步调试,把坑都填平。