按时间线写的,建议看完,因为中间有的步骤不必重蹈覆辙。
1、安装RT_Thread Studio、STM32F4的SDK,新建工程编译报错error: 'struct serial_configure' has no member named 'flowcontrol'
1.1、报错含义
结构体struct serial_configure没有flowcontrol成员。
1.2、报错分析
报错代码所属的文件是STM43F4芯片SDK,但是类型定义struct serial_configure属于内核代码,内核的版本太低了。
1.3、解决方案
1.3.1、修改代码
不需要串口流控,注释掉报错的这段。(可以但不想这么做)
1.3.2、更新内核版本
打开SDK管理器,找到“RT-Thread_Source_Code”,可以看到默认安装的是4.0.3和4.0.2版本,然后下载最新版5.0.2.
2、使用最新内核5.0.2,报错error: expected '=', ',', ';', 'asm' or '__attribute__' before 'void'
2.1、报错含义
void前有错误,缺少=,;asm __attribute__
2.2、报错分析
void前是RT_WEAK,编译器不认识,所以报错。
对比刚才的工程却没报这个错,现在内核是5.0.2,说明啥,内核又太新了,这个RT_WEAK在5.0.2中有改动。
2.3、解决方案
2.3.1、修改代码1——去掉RT_WEAK
RT_WEAK代表的是弱定义的函数,如果用户在别的地方重写就不调用RT_WEAK的这个函数,如果没有重写,因为有弱定义的函数也不会报错;
去掉RT_WEAK,需要自定义函数的时候就注释掉原来的,重新写,不冲突就行。
2.3.2、修改代码2——找到现在内核的弱定义
Ctrl+H,在工程中直接搜索“RT_WEAK”试试看,这个操作不一定成功,因为不知道改动成什么了,如果“RT_WEAK”搜不到我可能会尝试搜索“weak”。
可以看到内核中使用的是小写的rt_weak,但是芯片SDK使用的是大写的RT_WEAK,这就是错误的原因。
不想去修改内核的代码,那么可以:
- 直接将报错的RT_WEAK改为小写的rt_weak;
- 或者再加一个宏定义,#define RT_WEAK rt_weak,可以放在头文件board.h里;
2.3.3、找到匹配的内核包
其实在芯片SDK的“描述”里有写,只是没看英文,使用STM32F4_0.2.3需要更新内核为4.1.0;
3、扩展
更新是有规范的,官网能找到更新的记录,顺便也可以看看别的地方的更新内容,为下次报错做准备。