本帖最后由 huangxuejia-29212 于 2018-5-15 11:02 编辑
今天开始移植uboot中的命令行功能到STM32上,使用的是MDK(KEIL)编译器。 UBOOT CMD其实以前移植过一次,平台是K21+IAR。由于代码中有部分与编译器有关,折腾了半天才实现。特地记录。 UBOOT CMD的代码中,有一个比较特殊的定义。 命令的定义通过一个宏声明一个结构体,这个结构体如下
我们先分析这个宏的功能 - __root: 被修饰的变量或者函数在用户程序里面没有显式调用情况下,也不会被优化掉。 - const: 这个大家应该常用,就是将变量定义为常量,保存在FLASH,不占用RAM。 - cmd_tbl_t: 结构体定义 - strcmd_##name: 宏名字,例如宏第一个参数是test,编译后得结构体名字就是strcmd__test - @ ".cmd": 定义的结构体保存在.cmd段,这个段是在IAR工程的.icf文件中定义。 剩下的就是赋值给结构体了。 这样定义的结果就是: MDK(KEIL)定义 那么在MDK下要怎么定义呢? - 首先是如下,通过attribute 关键字将结构体放到cmd段中。
中间一段就是增加的 cmdreg区域名字。 +0的意思是紧跟着其他代码段。 .ANY(cmd) 这个比较关键,跟代码中的(section ("cmd"))对应。
编译后,查看.map文件(通常在工程下的Listings文件夹下)
从中也可以看到我们前面定义的意思 代码中使用段地址跟长度cmdreg是Execution Region名字 Base: 0x080ff000, Size: 0x000000a8, Max: 0x00001000 我们现在只用了0x000000a8字节 cmd 是E Section Name 好的,前面我们已经定义了一个命令段,那代码中怎么用这个段呢? 像下面这样使用即可。
--keep是在MDK设置中定义,能不能直接在代码中定义? 通过shell交互--keep=cmd_*会有匹问题,如果以后其他模块定义类似的变量或者函数,就同样不会被优化了。 能不能在代码中直接指定不优化的内容?不使用通配符。 不管了,暂时能用先。 安装Xshell 5软件,配置一个串口链接。 增加命令![]() 系统启动后,敲下回车,出现命令行,输入help,查看有多少命令。 输入命令systeminfo,查看系统信息。 可以随意添加命令,按照下面的个是注册命令就可以了, REGISTER_CMD( systeminfo,2,1,do_system_info, "systeminfo", "\t display system info ");说明
本文档指说明了移植过在MDK的细节,对于UBOOT命令行的具体实现,有兴趣自行研究。 |
移植uboot命令行.rar
下载470.56 KB, 下载次数: 132
STM32
超强工具——STM32CubeMX 你会用吗?
集结出发! STM32全国研讨会系列之一:ST智能门铃中国首秀
关于STM32启动文件的几个小问题
【银杏科技ARM+FPGA双核心应用】STM32H7系列35——USB_VCP_FS
【银杏科技ARM+FPGA双核心应用】STM32H7系列28——USB_HID
粉丝分享 | 图说CRC原理应用及STM32硬件CRC外设
STM32L151进入低功耗,并由RTC唤醒的故事
[转]stm32控制NFC模块(PN532)源码(P2P,模拟卡,读写卡等
STM32G070RB+LVGL移植
微信公众号
手机版
http://github.com/wujique/stm32f407