硬汉嵌入式论坛

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

[有问必答] 关于MCU bootloader与app的固件版本号存放位置

  [复制链接]

77

主题

223

回帖

454

积分

高级会员

积分
454
发表于 2021-12-1 16:04:53 | 显示全部楼层 |阅读模式
像这种版本号信息一般放到哪?mcu内部flash?eeprom?
因为内部flash的页大小是2k,那么存在内部flash至少会占用到2k
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116216
QQ
发表于 2021-12-1 16:46:21 | 显示全部楼层
简单易用,存在这里就可以:
QQ截图20211201164605.png
回复

使用道具 举报

77

主题

223

回帖

454

积分

高级会员

积分
454
 楼主| 发表于 2021-12-1 17:22:16 | 显示全部楼层
eric2013 发表于 2021-12-1 16:46
简单易用,存在这里就可以:

这个0x00000207是地址,还是表示V1.00?
读时直接取地址么?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116216
QQ
发表于 2021-12-1 17:35:25 | 显示全部楼层
薪火相传 发表于 2021-12-1 17:22
这个0x00000207是地址,还是表示V1.00?
读时直接取地址么?

这个你随便表示,每个可以记录32bit数据,我们简单的注释了个V1.00,不必介意。
对,直接对读取这个地址内容即可。


回复

使用道具 举报

77

主题

223

回帖

454

积分

高级会员

积分
454
 楼主| 发表于 2021-12-1 18:03:57 | 显示全部楼层
eric2013 发表于 2021-12-1 17:35
这个你随便表示,每个可以记录32bit数据,我们简单的注释了个V1.00,不必介意。
对,直接对读取这个地址 ...

我还是有点不太明白,这个地址是特定的还是?好像不是内部闪存的地址
回复

使用道具 举报

354

主题

2171

回帖

3238

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3238
发表于 2021-12-2 09:11:14 | 显示全部楼层
薪火相传 发表于 2021-12-1 18:03
我还是有点不太明白,这个地址是特定的还是?好像不是内部闪存的地址

这就是一个内部的flash地址,大概是0x8000 001C
第一个DCD __initial_sp就是flash的首地址。后面每一行占用4个字节,也就是地址依次增加4个字节。
回复

使用道具 举报

77

主题

223

回帖

454

积分

高级会员

积分
454
 楼主| 发表于 2021-12-2 11:40:08 | 显示全部楼层
caicaptain2 发表于 2021-12-2 09:11
这就是一个内部的flash地址,大概是0x8000 001C
第一个DCD __initial_sp就是flash的首地址。后面每一行 ...

所以上面那个0x00000207只是个指针变量的名称?我能不能这样定义一个名称?这样会报错

1.png




回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116216
QQ
发表于 2021-12-2 11:55:25 | 显示全部楼层
薪火相传 发表于 2021-12-2 11:40
所以上面那个0x00000207只是个指针变量的名称?我能不能这样定义一个名称?这样会报错

这个默认是存到内部Flash的。
回复

使用道具 举报

0

主题

123

回帖

123

积分

初级会员

积分
123
发表于 2021-12-2 13:31:56 | 显示全部楼层
薪火相传 发表于 2021-12-2 11:40
所以上面那个0x00000207只是个指针变量的名称?我能不能这样定义一个名称?这样会报错

在40行后加一行
  1. IMPORT boot_ver
复制代码

应该就不会报错了,当然前提是你已经在其他C文件定义了一个名为boot_ver的全局字符串变量
回复

使用道具 举报

354

主题

2171

回帖

3238

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3238
发表于 2021-12-2 13:47:13 | 显示全部楼层
薪火相传 发表于 2021-12-2 11:40
所以上面那个0x00000207只是个指针变量的名称?我能不能这样定义一个名称?这样会报错

DCD是个汇编指令,后面是一个数据。 它是32bit的。 你可以写98976436之类的。 也可以用0x93784634。

你如果写boot_ver ,那么就需要补充定义一个数据给boot_ver。
回复

使用道具 举报

77

主题

223

回帖

454

积分

高级会员

积分
454
 楼主| 发表于 2021-12-2 14:05:47 | 显示全部楼层
caicaptain2 发表于 2021-12-2 09:11
这就是一个内部的flash地址,大概是0x8000 001C
第一个DCD __initial_sp就是flash的首地址。后面每一行 ...

是0x0800 001C
回复

使用道具 举报

77

主题

223

回帖

454

积分

高级会员

积分
454
 楼主| 发表于 2021-12-2 14:09:01 | 显示全部楼层
可以了,感谢几位小伙伴的解答,抱拳!
1.png

2.png



回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116216
QQ
发表于 2021-12-2 19:11:16 | 显示全部楼层
薪火相传 发表于 2021-12-2 14:09
可以了,感谢几位小伙伴的解答,抱拳!

不容易,终于搞定了
回复

使用道具 举报

7

主题

36

回帖

57

积分

初级会员

积分
57
发表于 2022-1-10 10:59:11 | 显示全部楼层
有点疑问,为什么定义版本号不能直接在代码里面直接定义一个变量 uint32_t g_version = 2001// 表示V2.0.0.1     每次版本修改了,直接修改这个变量就好了。。
回复

使用道具 举报

98

主题

359

回帖

653

积分

金牌会员

积分
653
发表于 2022-1-11 11:34:05 | 显示全部楼层
xdh873939316 发表于 2022-1-10 10:59
有点疑问,为什么定义版本号不能直接在代码里面直接定义一个变量 uint32_t g_version = 2001// 表示V2.0.0. ...

我理解的是为了实现不经过用户程序即可得到版本号的目的,比如程序变板砖了。又或者主程序去获得BOOT程序的版本,直接读绝对地址就可以。
回复

使用道具 举报

2

主题

20

回帖

26

积分

新手上路

积分
26
发表于 2024-10-16 19:51:03 | 显示全部楼层
用变量的方式试了怎么是不行的,IMPORT boot_ver ,在别的文件里有定义了boot_ver为const常量数据了,编译没有问题,但是实际读出来数据不对,直接写数据就没有问题,是什么原因?
回复

使用道具 举报

2

主题

20

回帖

26

积分

新手上路

积分
26
发表于 2024-10-16 19:51:29 | 显示全部楼层
用变量的方式试了怎么是不行的,IMPORT boot_ver ,在别的文件里有定义了boot_ver为const常量数据了,编译没有问题,但是实际读出来数据不对,直接写数据就没有问题,是什么原因?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116216
QQ
发表于 2024-10-17 09:53:46 | 显示全部楼层
zzh616320030 发表于 2024-10-16 19:51
用变量的方式试了怎么是不行的,IMPORT boot_ver ,在别的文件里有定义了boot_ver为const常量数据了,编译 ...

那就干脆,直接写就行。
回复

使用道具 举报

2

主题

20

回帖

26

积分

新手上路

积分
26
发表于 2024-10-17 10:26:18 | 显示全部楼层
eric2013 发表于 2024-10-17 09:53
那就干脆,直接写就行。

谢谢回复,如果用const变量有办法吗,或者想用一个宏定义,但是我看这个文件不可以用宏定义,主要是我们软件分了几个分支对应不一样的产品,直接写的话不方便每次都需要修改,现在的做法是做了一个宏去定义boot_ver这个变量为不一样的值,然后引用这个值
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116216
QQ
发表于 2024-10-18 10:08:53 | 显示全部楼层
zzh616320030 发表于 2024-10-17 10:26
谢谢回复,如果用const变量有办法吗,或者想用一个宏定义,但是我看这个文件不可以用宏定义,主要是我们 ...

const attribute at设置到指定地址满足需求不
回复

使用道具 举报

2

主题

20

回帖

26

积分

新手上路

积分
26
发表于 2024-10-18 10:43:54 | 显示全部楼层
eric2013 发表于 2024-10-18 10:08
const attribute at设置到指定地址满足需求不

如果用const attribute at,这个地址可以用0x0800C020这个地址吗,这个就是跟上面实现的是同一个地址了
回复

使用道具 举报

2

主题

20

回帖

26

积分

新手上路

积分
26
发表于 2024-10-18 10:45:14 | 显示全部楼层
eric2013 发表于 2024-10-18 10:08
const attribute at设置到指定地址满足需求不

上次的说错了,应该是0x08000020,这个地址
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116216
QQ
发表于 2024-10-19 09:45:05 | 显示全部楼层
zzh616320030 发表于 2024-10-18 10:45
上次的说错了,应该是0x08000020,这个地址

这地址,还是直接写道.s启动文件的向量表里面方便
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2024-11-18 17:52:22 | 显示全部楼层
zzh616320030 发表于 2024-10-18 10:43
如果用const attribute at,这个地址可以用0x0800C020这个地址吗,这个就是跟上面实现的是同一个地址了

直接用const attribute at就行了,可以定位到flash末尾附近的地址上,无论是bootloader上还是app里都方便读,并且不会占用整页的容量。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116216
QQ
发表于 2024-11-19 09:55:38 | 显示全部楼层
kaixuan520 发表于 2024-11-18 17:52
直接用const attribute at就行了,可以定位到flash末尾附近的地址上,无论是bootloader上还是app里都方便 ...

这种方式使用非常方便,但有个小缺点,生成的bin问题比较大,特别是有效程序大小和版本号之间地址区域有较大空闲时。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-10 09:15 , Processed in 0.410479 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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