第二章 开发环境搭建:工欲善其事,必先利其器

好,咱们正式开始动手。这一章,我带你把开发环境从头到尾捋一遍。说实话,很多初学者卡在第一步——环境没搭好,后面全是坑。我自己早年也吃过这个亏,装个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帮你省了这一步。

我的建议:如果你做的是TC3xx系列,直接上ADS。ModusToolbox更适合XMC或者PSoC,那个平台我后面会单独讲。

2.2 安装AURIX Development Studio

去英飞凌官网下载最新版。注意,别下错了版本——ADS有Windows和Linux版,我建议用Windows,生态更全。

  1. 双击安装包,一路Next。但有个关键点:安装路径不要有中文。我曾经见过有人装在“D:\开发工具”下,结果编译报错,查了半天是路径编码问题。
  2. 安装过程中会提示你选择组件。默认全选就行,但如果你硬盘空间紧张,可以去掉“文档”和“示例工程”,这些后面可以单独下载。
  3. 安装完成后,第一次启动会提示你设置工作空间(Workspace)。我建议单独建一个文件夹,比如 D:\FreeRTOS_Workspace,别跟其他项目混在一起。
注意:ADS自带的是Eclipse框架,如果你之前装过其他Eclipse版本,可能会有插件冲突。我建议先卸载旧版Eclipse,或者换个工作空间。

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工程

  1. 打开ADS,点击 File → New → AURIX Project
  2. 输入工程名,比如 FreeRTOS_TC375。芯片型号选你手头的板子,我这边用的是TC375 Lite Kit。
  3. 选择编译器。我建议用 Tasking,因为它的优化做得好,而且跟ADS深度集成。GCC也行,但性能差一些。
  4. 点击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上。到时候我会带你一步步调试,把坑都填平。