接了公司一个项目,这是一个采用Dante模块把I2S数据通过网络交换机转发的音频控制器。包含两个串口配置。一开始以为使用裸机即可满足项目要求,实际上如果只有一个串口确实能满足要求了,现在发现Dante模块也需要串口通讯,2个串口同时存在下,裸机程序开始变得不可靠。
于是决定移植个RTOS系统进去。
第一步 下载FreeRTOS开源包
下载 FreeRTOS - FreeRTOS™
第二步 将包内的source文件夹内容拷贝到工程根目录下新建的FreeRTOS文件夹内
包内的source文件夹:
新建的FreeRTOS文件夹拷贝的内容:
再进入Demo,找到自己对应架构的处理器的demo里的FreeRTOSConfig.h拷贝到include文件夹内
第三步 处理拷贝来的文件内容,需要裁剪一部分,只保留自己要用的。
裁剪 portable内容,这里面存储的是软件系统和硬件层面的桥接内容。其中我们需要保存三个文件夹Keil、MemMang、RVDS
RVDS文件夹:存储的是不同内核芯片的移植文件
Keil文件夹:指向RVDS
MemMang文件夹:内存管理文件,包括各种内存配置模式。详细参考:FreeRTOS 堆内存管理 - FreeRTOS™
第四步 在Keil中添加两个Group,分别存储核心文件和portable文件,并添加需要的配置文件。
这里两个组名可以自定义,我选择模仿其他网友命名:FreeRTOS_COR和FreeRTOS_PORTABLE
添加核心文件
添加portable文件(根据处理器不同选择)
这一步我出现问题了,这里先讲常见处理器的标准操作:将内存管理文件丢进去,再将特定处理器架构的port.c文件丢进去。
但是这里我发现没有我想要的处理器。我的项目是基于Cortex-M23来做的,RVDS文件夹中根本没有我要的处理器配置文件。于是我去搜索官网,发现是有这个案例的,说明肯定能实现,只是目前没找到方法。我随便拿了个m3的port去试试,发现一堆报错27个,有提示__root没定义的,有提示缺失字符的(明明存在)。
开始我以为是
于是我返回到最开始选择portable文件夹的那一步,其实我使用的编译器是GCC,于是我把GCC文件夹也加进来了。并且在里面找到了我要的M23内核port.c文件。
M23是有安全区和非安全区的区别。一般不是用于加密的产品可以直接使用非安全的配置。
加入GCC文件夹,并且删掉了GCC内除了M23以外的文件夹
然后把GCC内m23文件夹的非安全区的port.c加入到工程,还有内存管理中heap_4.c加入进来。这个heap_x.c文件根据自己的需要选择。
这里就发现自己的报错从27个降低为1个了。
这个报错显示'secure_context.h' file not found,找一下这个文件,发现在安全区配置文件夹内
但是我使用的是非安全区配置,检查一下缺失这个头文件的报错地方
这里的configENABLE_TRUSTZONE是FreeRTOSConfig.h文件中的定义
可以看到FreeRTOSConfig.h中的使能TRUSTZONE开了,我不使用安全区,应该设为0
编译,发现提示的错误不同了。
这是滴答定时器重定义的问题,因为我是在原有工程的基础上移植FreeRTOS,所以原先程序的滴答定时器和RTOS系统中的滴答定时器冲突了。
这个网上大把解决方案。先写到这