今天学习使用scons命令从rtthrea源代码,生成一个纯净的rtthread工程。
- 下载 rt-thread-master包
- 由于手上有一套野火的开发板,就选了bsp/stm32f10x-HAL这个工程
- 在工程目录中,进入env,使用命令“scons --target=mdk5”,对工程进行更新
- 然后打开更新过后的keil工程,工程编译正常,可以生成bin文件
- 关闭该工程,再次进入env,使用命令“scons --dist”,顺利生成一个dist目录的新的工程出来,拷贝dist工程到合适的位置,同样进入工程目录后,使用env工具,用命令“scons --target=mdk5”,对工程进行更新。也可以顺利进行。
-
生成新的keil工程后,打开工程进行编译,会报错。
报错截图
根据错误提示,Error: L6218E: Undefined symbol rt_hw_interrupt_disable (referred from drv_gpio.o).
是rt_hw_interrupt_disable这几个函数未定义,我在原工程搜索了一下,发现这几个函数在libcpu中,想着会不会是生成新工程,没有将libcpu拷贝,所以就将这个文件夹全部拷贝到dist的根目录,重新编译,又报另外几个函数 重复定义
的错误。

-
根据错误提示,by cortex-m3_cpuport.o and cpuport.o,说明之前新建的工程中,已经有cpuport.c文件了,重新查看搜索了一下工程,发现新建的工程文件中,dist\stm32f10x-HAL\rt-thread\libcpu\arm\cortex-m3这个目录下已经存在了libcpu,当然cpuport.c文件也在里面了,对比了一下这个目录和源工程目录rt-thread-master\libcpu\arm\cortex-m3,发现里面只有cpuport.c和context_gcc.S(gcc编译器用的)两个文件,比源文件烧录iar和keil的处理中断的汇编代码。
-
不用说,继续将keil对应的context_rvds.S文件,放入dist对应的libcpu目录下,重新进入env,命令“scons --target=mdk5”更新工程,确实发现了这个汇编文件。如下图:

-
既然找到了文件,就再次打开生成的keil工程,重新编译吧,果不其然,顺利通过编译,至此这条“scons --dist”命令,才算真正从rtthread源代码实现了私有工程的创建!!
image.png
-
来条总结:
实践说明,在使用“scons --dist”命令时,。env默认是将工程按照gcc编译器的情况进行生成的,并没有按照mdk5。百度了一下,发现网上已经有前辈们淌过坑,只是自己没注意,也淌了坑!!!具体方法如下图所示,在env工具中执行下图的命令(1)。
image.png
在工程目录的rtconfig.py文件中也可以验证,默认是gcc编译器
需要注意的是,不是SETRTT_CC=XXX,是SET RTT_CC=XXX,SET命令后面有空格,RTT_CC是一个变量,表示RTT的编译器名称。
网友评论