硬汉嵌入式论坛

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

[STM32H7] 关于分散加载的想法

[复制链接]

4

主题

531

回帖

543

积分

金牌会员

积分
543
发表于 2018-4-13 15:22:47 | 显示全部楼层 |阅读模式
例如st,我想把main函数默认定义flash地址,比如有个闪灯程序定义到8001000地址,用keil分散加载,能生成两个bin吗?分别下两次程序,如果需要更新,也只需要更新其中一个不用全部更新!
呼叫一下硬汉大哥,有没有这种操作?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106692
QQ
发表于 2018-4-13 15:26:41 | 显示全部楼层
要实现什么功能,没听懂。
回复

使用道具 举报

4

主题

531

回帖

543

积分

金牌会员

积分
543
 楼主| 发表于 2018-4-13 15:33:02 | 显示全部楼层
eric2013 发表于 2018-4-13 15:26
要实现什么功能,没听懂。

这两个函数在一个工程。
1.比如我把main函数定义到8000000这个地址,这个是默认的!
然后我给8001000定义一个点灯1程序!
2.我给8001000加个功能,例如点灯1的时候灯2亮!,我想的是生成2个bin一个是main,一个是led的bin,我每次只用更新led. bin在8001000地址
这个方案可行吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106692
QQ
发表于 2018-4-13 15:41:05 | 显示全部楼层
qiousanxi 发表于 2018-4-13 15:33
这两个函数在一个工程。
1.比如我把main函数定义到8000000这个地址,这个是默认的!
然后我给8001000定 ...

你这个做个bootloader不就行了。
8000000是boot代码
8001000是app代码
回复

使用道具 举报

4

主题

531

回帖

543

积分

金牌会员

积分
543
 楼主| 发表于 2018-4-13 15:49:38 | 显示全部楼层
eric2013 发表于 2018-4-13 15:41
你这个做个bootloader不就行了。
8000000是boot代码
8001000是app代码

想换种方法
回复

使用道具 举报

4

主题

531

回帖

543

积分

金牌会员

积分
543
 楼主| 发表于 2018-4-13 16:00:57 | 显示全部楼层
eric2013 发表于 2018-4-13 15:41
你这个做个bootloader不就行了。
8000000是boot代码
8001000是app代码

公司想让做一种类似于elf加载的模式,我刚才试了可以生成两个bin,keil根据地址自动分配,但是如果给zi dadt不是default时会抱警告
回复

使用道具 举报

6

主题

122

回帖

140

积分

初级会员

积分
140
发表于 2018-4-13 16:02:23 | 显示全部楼层
双BANK是不是可以实现
回复

使用道具 举报

2

主题

109

回帖

115

积分

初级会员

积分
115
发表于 2018-4-13 16:48:07 | 显示全部楼层
说的云里雾里的
回复

使用道具 举报

7

主题

102

回帖

123

积分

初级会员

积分
123
发表于 2018-4-13 18:15:18 | 显示全部楼层
不能这样做,重新编译的时候有可能同一个函数的入口地址等会改变,尤其是RAM那里更难搞。给你两个思路。

1.分开两个程序可以,底层程序提供给上层程序的函数,用固定地址方式弄一个函数指针数组。上层程序直接通过这个固定地址获取数组,然后调用对应函数。还有就是两个程序的RAM要独立分配,不要有重复了。

2.直接使用支持动态加载的系统吧,如rt-thread的module功能,实际上就是动态加载elf。缺点是全部都load到内存上,占用较多的RAM。如nuttx的FLAT(好像是叫这个名字?),也能实现类似功能,而且是可以直接在FLASH运行,不过我没去深入了解过,也没用过。rtems也有这种功能,之前稍微玩过一下,算是rt-thread和nuttx两种的混合,感觉还不如直接用rt-thread的方式。
回复

使用道具 举报

4

主题

531

回帖

543

积分

金牌会员

积分
543
 楼主| 发表于 2018-4-13 19:03:04 | 显示全部楼层
eddy0317 发表于 2018-4-13 18:15
不能这样做,重新编译的时候有可能同一个函数的入口地址等会改变,尤其是RAM那里更难搞。给你两个思路。

...

rtt的用过,领导不让用,想让用contiki的elf加载!可是没一个例程,上手难度太大!所以自己想想办法
我试了一下我的思路,可能行不通!我把ram已经分开了,flash也分成了两个,比如说8010000地址的led函数改变了,也会导致8000000的main函数编译的bin有少许改变的
回复

使用道具 举报

7

主题

102

回帖

123

积分

初级会员

积分
123
发表于 2018-4-13 22:22:18 | 显示全部楼层
汗,给用contiki不给用rtt?真奇怪。函数位置没所谓,弄个指针函数。

试试这样,应该可以才对。两个程序都定义这个结构体:
struct funcs_struct
{
    void (*led_func)(void);
    void (*io_func)(void);
};

然后在led函数实现的程序,弄一个这个结构体,固定位置的,如:
const struct funcs_struct funcs __attribute__((at(0x08001100))) =
{
    led,
    gpio
};

再在调用的程序,这样:
struct funcs_struct const *pfuncs;
pfuncs = (struct funcs_struct const *)0x08001100;
pfuncs->led_func();

理论上应该可行的。只要需要相互调用的程序不太多的话。不然就把RTT的搬过来,好像就一个c文件而已
回复

使用道具 举报

4

主题

531

回帖

543

积分

金牌会员

积分
543
 楼主| 发表于 2018-4-14 00:43:32 | 显示全部楼层
eddy0317 发表于 2018-4-13 22:22
汗,给用contiki不给用rtt?真奇怪。函数位置没所谓,弄个指针函数。

试试这样,应该可以才对。两个程序 ...

后面我试试
回复

使用道具 举报

262

主题

578

回帖

1364

积分

至尊会员

积分
1364
发表于 2018-4-14 09:15:57 | 显示全部楼层
通过sct文件就可以了,
设置keil下生成bin文件的,如果是两个文件的话,就是一个.bin的文件夹,而不是一个.bin的文件
回复

使用道具 举报

0

主题

10

回帖

10

积分

新手上路

积分
10
发表于 2020-1-27 19:04:37 | 显示全部楼层
应该有这种操作。我也特别想知道怎么才能完美搞定这个事情。不知道你后续是如何处理这个事情的?现在我遇见的一个问题是一个更新了,别的函数即便没有更改,生成的hex也会改变。用了keep也没彻底搞定。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-30 03:48 , Processed in 0.198508 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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