硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3218|回复: 9
收起左侧

[有问必答] 请教各位同志关于MCU代码移植的问题

[复制链接]

5

主题

28

回帖

43

积分

新手上路

积分
43
发表于 2018-3-11 18:54:13 | 显示全部楼层 |阅读模式
背景:公司有个2006年老项目,方案是:stm32f103vet6 ,arm-none-eabi gcc 工具链 在linux环境下编译开发,而且使用了结构体访问寄存器的方案,example如下所示(c99),全部代码都用这种指针方式访问寄存器(估计是st最早的库吧?)
  1. typedef struct {
  2.                 vu32
  3.                         ENABLE:1,
  4.                         TICKINT:1,
  5.                         :14,
  6.                         COUNTFLAG:1,
  7.                         :15;
  8.                 int r[4];
  9.                 vu32 RELOAD;
  10.                 vu32 CURRENT;
  11.                 vu32 TENMS;
  12. } SYSTICKREGS;

  13. extern SYSTICKREGS SYSTICK;
复制代码
工具链如下:
捕获.PNG

因现在业务需求要加很多新功能,任务多了f103有点吃不消,io口也不够,所以想把这套代码整体移植到性能高一点的平台,比如stm32f429等,但是目前主流做法都是基于keil平台,使用标准库或hal开发,我对keil不熟悉,所以造成了移植的很大难度。
整理一下移植需要做的内容及问题如下:
1.把所有对寄存器直接操作 替换成 使用标准库或者hal操作,初步估计有15000行代码,这种工作量是否太大?
2.对于某些依赖于gcc编译器的代码比如 eGlobal __attribute__((section(".runtime_globals"))) globals,这种代码将指定变量放到固定的目标文件自定义段的操作,还有将某些变量放到用户指定地址 ,这些在mdk中是否能实现?
3.老代码跑的是freertos4.xx 是否有必要替换成更新的版本?
4.目前代码编译后的bin大小在200k flash空间,如果采用库开发的话,会增加多少空间?

最后,对于老代码移植到新mcu,有没有更好的方案?求各位大佬给点建议,感激不尽。


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
发表于 2018-3-12 01:27:05 | 显示全部楼层
1、寄存器操作的,推荐还用寄存器,这个无需花精力修改。
2、没问题,在MDK的help文档对这种指令有专门说明。
3、这个版本的确太古老了,升级下吧。
4、如果你换成F429的话,最小1MB。像我们用的F429BIT6有2MB,这个的话,楼主无需担心。

推荐新建个工程,重新创建工程组合下。
回复

使用道具 举报

5

主题

28

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2018-3-12 19:23:17 | 显示全部楼层
eric2013 发表于 2018-3-12 01:27
1、寄存器操作的,推荐还用寄存器,这个无需花精力修改。
2、没问题,在MDK的help文档对这种指令有专门说 ...

感谢硬汉大佬,对于第一个问题,我还有点疑问,f103和f429的寄存器内存布局是一样的么?代码换到f429上直接能跑?最头疼的就是改这里。。另外还请大佬指点,在移植的过程中有什么需要注意的事项?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
发表于 2018-3-13 01:40:49 | 显示全部楼层
wkler 发表于 2018-3-12 19:23
感谢硬汉大佬,对于第一个问题,我还有点疑问,f103和f429的寄存器内存布局是一样的么?代码换到f429上直 ...

如果是外设类的话,有些区别,具体你要对比下寄存器了。
回复

使用道具 举报

2

主题

134

回帖

140

积分

初级会员

积分
140
发表于 2018-3-13 10:40:37 | 显示全部楼层
牵涉到寄存器操作一般都是硬件接口的初始化或者数据收发  建议你更改HAL库   其实也很简单  而且st官方提供了足够多的例程   你说的第二点再mdk keil也是可以实现的  只不过写法有点区别  这点官方也给了例程  另外你可以使用sw4stm32开发  GCC的  开发起来也比较方便  我现在st的开发大多数用这个
回复

使用道具 举报

5

主题

28

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2018-3-13 11:47:31 | 显示全部楼层
hanzixiangel 发表于 2018-3-13 10:40
牵涉到寄存器操作一般都是硬件接口的初始化或者数据收发  建议你更改HAL库   其实也很简单  而且st官方提供 ...

嗯嗯,你提供这个方案,用sw4stm32 gcc工具链可以减小很多工作量,感谢!
回复

使用道具 举报

39

主题

929

回帖

1051

积分

至尊会员

积分
1051
发表于 2018-3-13 12:04:19 | 显示全部楼层
我们的程序都是对硬件访问做一层封装的,不管是芯片本身的硬件资源,还是外围的硬件资源,都不能直接访问,要做一层封装。比如RTC资源,要封装成 RTC_Init,RTC_Read 等,并对这些接口做说明。这样上层程序基本上就和芯片平台无关了。使用有操作系统的,最好也做接口转换,以尽可能的实现和OS的低耦合度。移植的时候,无论你是换OS还是升级OS,无论是换编译器还是换芯片,基本上只需要修改好这些接口,简单高效。至于楼主的问题,个人倾向于先重构,再移植。当然,如果有信心的话,一边重构一边移植。
回复

使用道具 举报

5

主题

28

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2018-3-13 19:28:13 | 显示全部楼层
ghslfgkkl88 发表于 2018-3-13 12:04
我们的程序都是对硬件访问做一层封装的,不管是芯片本身的硬件资源,还是外围的硬件资源,都不能直接访问, ...

谢谢回复,按照您的意思,使用HAL库重新写的话,是不是就相当于封装了一层?以后我直接换不同芯片的HAL就行了,HAL接口名字应该不会变吧?
回复

使用道具 举报

5

主题

28

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2018-3-13 19:35:10 | 显示全部楼层
hanzixiangel 发表于 2018-3-13 10:40
牵涉到寄存器操作一般都是硬件接口的初始化或者数据收发  建议你更改HAL库   其实也很简单  而且st官方提供 ...

今天试了一下sw4stm32,配合cubeMX生成代码,确实好用,关键是gcc的工具和我原来那个正好吻合,非常好,我接下来会使用这个方案移植代码,再次感谢!
回复

使用道具 举报

2

主题

134

回帖

140

积分

初级会员

积分
140
发表于 2018-3-14 10:35:58 | 显示全部楼层
wkler 发表于 2018-3-13 19:35
今天试了一下sw4stm32,配合cubeMX生成代码,确实好用,关键是gcc的工具和我原来那个正好吻合,非常好, ...

客气了 亲  sw4stm32是基于eclipse开发的   开发起来可能会比mdk友好一些   配合cubemx效率会很高  
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-11 13:44 , Processed in 0.278566 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表