你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

将UBOOT的命令行功能移植到STM32F407

[复制链接]
huangxuejia-292 发布时间:2018-5-15 10:51
本帖最后由 huangxuejia-29212 于 2018-5-15 11:02 编辑

够用的硬件
能用的代码
实用的教程
屋脊雀工作室编撰 -20180418
官网:www.wujique.com
github:http://github.com/wujique/stm32f407
资料下载:https://pan.baidu.com/s/1pQrKr2_Jufd-cEYV4ZYAFw
本文章资料在stm32f407\4 教程--其他系统模块\移植uboot命令行目录

今天开始移植uboot中的命令行功能到STM32上,使用的是MDK(KEIL)编译器。
其实以前移植过一次,平台是K21+IAR。由于代码中有部分与编译器有关,折腾了半天才实现。特地记录。
UBOOT CMD
UBOOT CMD的代码中,有一个比较特殊的定义。
命令的定义通过一个宏声明一个结构体,这个结构体如下
  1. #define REGISTER_CMD(name,maxargs,rep,cmd,usage,help) \      __root  const cmd_tbl_t strcmd_##name @ ".cmd" =  {#name, maxargs, rep, cmd, usage,help}
复制代码

我们先分析这个宏的功能
- __root:
被修饰的变量或者函数在用户程序里面没有显式调用情况下,也不会被优化掉。
- const:
这个大家应该常用,就是将变量定义为常量,保存在FLASH,不占用RAM。
- cmd_tbl_t:
结构体定义
- strcmd_##name:
宏名字,例如宏第一个参数是test,编译后得结构体名字就是strcmd__test
- @ ".cmd":
定义的结构体保存在.cmd段,这个段是在IAR工程的.icf文件中定义。
剩下的就是赋值给结构体了。
这样定义的结果就是:
定义了一个放在.cmd段的结构体,就算这个结构体没有显式调用,也不会被程序优化。
MDK(KEIL)定义
那么在MDK下要怎么定义呢?
- 首先是如下,通过attribute 关键字将结构体放到cmd段中。
  1. #define REGISTER_CMD(name,maxargs,rep,cmd,usage,help) \            const cmd_tbl_t strcmd_##name __attribute__ ((section ("cmd"))) =  {#name, maxargs, rep, cmd, usage,help}
复制代码

  • 第二,就是要使用自定义的分散加载文件

    把左上角的use memory layout from target Dialog前面的勾去掉。
    然后点击右边中间的Edit按钮,关掉窗口,就可以编辑.sct文件了。

  1. LR_IROM1 0x08000000 0x00100000  {    ; load region size_region
  2.   ER_IROM1 0x08000000 0x000ff000  {  ; load address = execution address
  3.    *.o (RESET, +First)
  4.    *(InRoot$Sections)
  5.    .ANY (+RO)
  6.   }

  7.   cmdreg +0
  8.   {
  9.         .ANY(cmd)
  10.   }
  11.   RW_IRAM1 0x20000000 0x00020000  {  ; RW data
  12.    .ANY (+RW +ZI)
  13.   }
  14. }
复制代码


中间一段就是增加的
cmdreg区域名字。
+0的意思是紧跟着其他代码段。
.ANY(cmd) 这个比较关键,跟代码中的(section ("cmd"))对应。
也可以指定这个段的起始地址跟长度
cmdreg 0x080ff000 0x1000
{
.ANY(cmd)
}
  • 第三,就是要防止这些变量被优化
    在option中设置

    看下面,Misc controls中,添加一个宏“--keep=strcmd_*”,意思是所有strcmd_开头的变量跟函数,都不会被优化。
确认结果
编译后,查看.map文件(通常在工程下的Listings文件夹下)
  1. Execution Region cmdreg (Exec base: 0x08048efc, Load base: 0x08048efc, Size: 0x000000a8, Max: 0xffffffff, ABSOLUTE)

  2. Exec Addr    Load Addr    Size         Type   Attr      Idx    E Section Name        Object

  3. 0x08048efc   0x08048efc   0x0000001c   Data   RO        16605    cmd                 cmd_sys.o
  4. 0x08048f18   0x08048f18   0x0000001c   Data   RO        16606    cmd                 cmd_sys.o
  5. 0x08048f34   0x08048f34   0x0000001c   Data   RO        16607    cmd                 cmd_sys.o
  6. 0x08048f50   0x08048f50   0x0000001c   Data   RO        16608    cmd                 cmd_sys.o
  7. 0x08048f6c   0x08048f6c   0x0000001c   Data   RO        16685    cmd                 commnad.o
  8. 0x08048f88   0x08048f88   0x0000001c   Data   RO        16686    cmd                 commnad.o
复制代码

从中也可以看到我们前面定义的意思
cmdreg是Execution Region名字
Base: 0x080ff000, Size: 0x000000a8, Max: 0x00001000
我们现在只用了0x000000a8字节
cmd 是E Section Name
代码中使用段地址跟长度
好的,前面我们已经定义了一个命令段,那代码中怎么用这个段呢?
像下面这样使用即可。
  1. extern unsigned char Load$cmdreg$Base[];
  2. extern unsigned char Load$cmdreg$Length[];

  3. unsigned long add = (unsigned long)Load$cmdreg$Base;
  4. unsigned long len = (unsigned long)Load$cmdreg$Length;

  5.         uart_printf("cmd addr:%08x, limit:%08x\r\n", add, len);
复制代码

在网上查找如何引用段地址时,找到了这个网页:
http://www.cnblogs.com/Dreamxi/p/3507932.html
大家可以参考这个网页的做法。
问题
--keep是在MDK设置中定义,能不能直接在代码中定义?
--keep=cmd_*会有匹问题,如果以后其他模块定义类似的变量或者函数,就同样不会被优化了。
能不能在代码中直接指定不优化的内容?不使用通配符。
不管了,暂时能用先。
通过shell交互
安装Xshell 5软件,配置一个串口链接。

系统启动后,敲下回车,出现命令行,输入help,查看有多少命令。
输入命令systeminfo,查看系统信息。
增加命令
可以随意添加命令,按照下面的个是注册命令就可以了,
REGISTER_CMD(    systeminfo,2,1,do_system_info,    "systeminfo",    "\t display system info ");说明
  • 1
    本次测试命令行基于freertos。
    因为命令行程序内部是while(1)死循环,如果没有操作系统任务调度,很难实现。
    除非只有命令行功能,并且其他功能全部通过命令行调用或者是中断。
  • 2
    代码托管在github:http://github.com/wujique/stm32f407/tree/sw_arch
总结
本文档指说明了移植过在MDK的细节,对于UBOOT命令行的具体实现,有兴趣自行研究。

移植uboot命令行.rar

下载

470.56 KB, 下载次数: 132

收藏 3 评论3 发布时间:2018-5-15 10:51

举报

3个回答
黑皮男 回答时间:2018-5-15 14:18:30
大神
zero99 回答时间:2018-5-17 16:59:05
学习了
huangxuejia-292 回答时间:2018-5-29 09:23:50
最新的代码请到github上获取,仓库会持续更新修正BUG优化性能
http://github.com/wujique/stm32f407

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版