打印

高分请教香斑竹和STM32高手几个问题

[复制链接]
8527|55
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
程序匠人|  楼主 | 2012-2-23 22:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
第1个问题:如何在程序运行过程中,由程序自己去把FLASH的程序区中某个单元写成0?

备注:匠人试过用下面这条指令去修改数据区的数据,成功。但是同样的指令去修改程序区的代码,失败!
FLASH_ProgramWord ((Address), 0);         //写32位数据


第2个问题:如何把一个函数,或一组数据定义在我指定的FLASH地址中?

备注:匠人找过一些网上的方法,依葫芦画瓢,没有成功。俺用的是IAR6.20


第3个问题:如何在FLASH指定的位置预留几个字节(内容保持全1),并禁止编译器把程序和数据编译在那里?


第4个问题:如何把一段代码复制到RAM中去运行,并在运行结束后销毁RAM中的这段代码?

第5个问题:如何获取一个函数的地址,或者如何获取一个函数的代码长度。

备注:匠人知道如何获取函数的首地址,但是希望CPU能自动获得某个函数的尾地址。当然,如果能获得该函数的代码长度,那么也可以根据其首地址+长度,求得尾地址来。

----------------------------------
我想,大家应该能看出匠人想干什么。你懂的。
沙发
殷淼| | 2012-2-23 22:51 | 只看该作者
刚刚开始使用这个,所以也不是很清楚,帮顶一下!

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
dianzi56 + 1
板凳
李富贵| | 2012-2-23 22:56 | 只看该作者
本帖最后由 李富贵 于 2012-2-23 23:13 编辑

看上去像是一个8051汇编狂人(小山沟里面的“打遍天下无敌手”的文盲农民)进入ARM领域(魔都,大上海)的一大堆疑惑。

使用特权

评论回复
地板
程序匠人|  楼主 | 2012-2-23 23:01 | 只看该作者
看上去像是一个8051汇编狂人(小山沟里面的文盲农民)进入ARM领域(魔都,大上海)的一大堆疑惑。
李富贵 发表于 2012-2-23 22:56


呵呵,俺现在用c写个几十k的小程序,已经没有障碍了。不过我问的这些问题,属于非典型应用……

使用特权

评论回复
5
李富贵| | 2012-2-23 23:02 | 只看该作者
不就是anti-crack么。

使用特权

评论回复
6
程序匠人|  楼主 | 2012-2-23 23:04 | 只看该作者
不就是anti-crack么。
李富贵 发表于 2012-2-23 23:02


yes

使用特权

评论回复
7
李富贵| | 2012-2-23 23:05 | 只看该作者
其实你的大部分答案可以先看icf文件,然后看帮助里面ilink部分就可以解决。

使用特权

评论回复
8
程序匠人|  楼主 | 2012-2-23 23:08 | 只看该作者
其实你的大部分答案可以先看icf文件,然后看帮助里面ilink部分就可以解决。
李富贵 发表于 2012-2-23 23:05


“帮助”是指IAR的帮助,还是……?

使用特权

评论回复
9
李富贵| | 2012-2-23 23:09 | 只看该作者
IAR菜单的help

使用特权

评论回复
10
程序匠人|  楼主 | 2012-2-23 23:24 | 只看该作者
IAR菜单的help
李富贵 发表于 2012-2-23 23:09


OK!多谢。看看先……

使用特权

评论回复
11
李富贵| | 2012-2-23 23:28 | 只看该作者
iar比mdk牛很多
小白都不知道

使用特权

评论回复
12
ARM_Lover| | 2012-2-23 23:58 | 只看该作者
我建议楼主用汇编吧!这样轻巧些!楼主还想把程序搬到RAM里,我也是菜鸟啊估计哈佛结构里面实现有困难,地址映射不到RAM 里吧!自己理解,不知对错,高手指正!

使用特权

评论回复
13
哲哲55| | 2012-2-24 07:16 | 只看该作者
呼呼,七点之前,竟然不能回帖子?

使用特权

评论回复
14
airwill| | 2012-2-24 09:10 | 只看该作者
本帖最后由 airwill 于 2012-2-24 09:14 编辑
第1个问题:如何在程序运行过程中,由程序自己去把FLASH的程序区中某个单元写成0?

备注:匠人试过用下面这条指令去修改数据区的数据,成功。但是同样的指令去修改程序区的代码,失败!
FLASH_ProgramWord ((Address ...
程序匠人 发表于 2012-2-23 22:44


问题1:  可以, 但这一条指令不行, Flash 得擦除后重写哦!
问题2:  这个可能得用连接命令才能真正搞定! 该代码段定地址, 看看连接手册吧
问题3:  程序中定义个 const 数组, 不就轻松搞定?
问题4:  这个一点问题都没有, 因为 mcu 支持在 RAM 里执行代码. 剩下的就是下面的问题了.
问题5:  有点麻烦, 我没有试过, 但是可以单独定义代码段, 是否可通过连接来获得代码长度?

使用特权

评论回复
15
zhaoyu2005| | 2012-2-24 09:22 | 只看该作者
14# airwill
印象中,如果把Flash某个地址数据改成全0,是不需要擦除的,擦除就是将所有位改成全1,然后将需要的位改成0.
所谓Flash写就是将1改成0,反过来不行,所以为了保险起见,需要先擦除。不过不知道STM32是否对准备写入的地址进行全1检测。

使用特权

评论回复
16
lxyppc| | 2012-2-24 09:27 | 只看该作者
本帖最后由 lxyppc 于 2012-2-24 09:33 编辑

第1个问题:如何在程序运行过程中,由程序自己去把FLASH的程序区中某个单元写成0?
匠人是不是开了写保护。STM32的Flash要先擦后写,如果某个单元的值不为0xffff,直接失败,写操作不会执行。

备注:匠人试过用下面这条指令去修改数据区的数据,成功。但是同样的指令去修改程序区的代码,失败!
FLASH_ProgramWord ((Address), 0);         //写32位数据


第2个问题:如何把一个函数,或一组数据定义在我指定的FLASH地址中?
没用过这么新的IAR,这个貌似要在链接脚本中定义一些segment,然后在代码中指定这些函数或数据属于哪个segment。用__attribute__的方式

备注:匠人找过一些网上的方法,依葫芦画瓢,没有成功。俺用的是IAR6.20


第3个问题:如何在FLASH指定的位置预留几个字节(内容保持全1),并禁止编译器把程序和数据编译在那里?
这个问题和第2个重复了


第4个问题:如何把一段代码复制到RAM中去运行,并在运行结束后销毁RAM中的这段代码?
直接用memcpy就可以,运行结束后memset就销毁了。一般会配上一些加密算法。ARM有相对PC寻址的指令,代码重定向的时候要注意。有的编译器会有生成可重定向代码的功能

第5个问题:如何获取一个函数的地址,或者如何获取一个函数的代码长度。
没有通用的办法,你可以这样试试。把你要加密的函数编译在同一片地址空间中。假设编译器会把函数连续存放。这样将生成的函数地址排序,就能间接得到函数的大小。

备注:匠人知道如何获取函数的首地址,但是希望CPU能自动获得某个函数的尾地址。当然,如果能获得该函数的代码长度,那么也可以根据其首地址+长度,求得尾地址来。

----------------------------------
我想,大家应该能看出匠人想干什么。你懂的。
匠人小心把自己玩进去:lol

使用特权

评论回复
17
程序匠人|  楼主 | 2012-2-24 09:30 | 只看该作者
问题1:  可以, 但这一条指令不行, Flash 得擦除后重写哦!
问题2:  这个可能得用连接命令才能真正搞定! 该代码段定地址, 看看连接手册吧
问题3:  程序中定义个 const 数组, 不就轻松搞定?
问题4:  这个一点问题都没 ...
airwill 发表于 2012-2-24 09:10


关于问题1:请注意,我要的是写“0”。理论上来说,“1”变“0”是不需要擦除的。只有“0”变“1”才需要擦除。我在数据区(也就是const数组)上试过,可以成功,但是如果是程序区,则失败。

关于问题3:如果定义const数组,我要的是能够在编译在指定的地方。其实这个问题和问题2的本质一样。

关于问题4:我需要一个范例。哪怕是最简单的。

使用特权

评论回复
18
程序匠人|  楼主 | 2012-2-24 09:40 | 只看该作者
16# lxyppc

关于第1个问题,如果是因为写保护的原因的话,那为什么同样是存放在flash中的CONST数组,不被保护呢?

关于第5个问题,我希望CPU自动去检查,而不是人工干预。如果要人工查看编译地址的话,似乎不太方便。

使用特权

评论回复
19
hwk612167| | 2012-2-24 09:48 | 只看该作者
第2个问题,数据可以,函数不行。
数据,如:const INT32U au32_num[] @ 0x8080 = {1,2,…………}
函数提示错误,Error[Be011]: location address not allowed for functions 1# 程序匠人

使用特权

评论回复
20
lxyppc| | 2012-2-24 10:15 | 只看该作者
16# lxyppc

关于第1个问题,如果是因为写保护的原因的话,那为什么同样是存放在flash中的CONST数组,不被保护呢?

关于第5个问题,我希望CPU自动去检查,而不是人工干预。如果要人工查看编译地址的话,似乎不太方 ...
程序匠人 发表于 2012-2-24 09:40

第1个问题还要看看Flash_Write的返回值。是否真的是写入成功
第5个问题其实是这样的
假如定义的代码段起始地址为ADDR_START, 结束地址为ADDR_END,把funA-funE都放在这个代码段中
然后再定义一个函数的地址表
typedef void(*pfn_t)(void);
保存这些函数的地址
pfn_t func_table[] = {funA,funB,funC,funD,funE};
然后对func_table进行排序
要求funA的大小,那就在func_table中找到funA的位置,如果为1
那么funA的大小就是func_table[2] - func_table[1];
如果是最后一个,那就把从ADDR_END开始向前找,找到第一个不为0xffff的位置,用这个位置减去函数地址。
这个只是一个示例,实际情况要复杂得多。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名: 《匠人手记》第二版已经上市,各大网络书店和实体书店有售! 匠人手机——手机中的颤抖机!欧耶! 匠人手记——手记中的战斗记!欧耶!

734

主题

11156

帖子

676

粉丝