OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 13609|回复: 8

STM32中,常量的绝对定位问题、指针长度问题。

[复制链接]

6

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2013-8-22
在线时间
2 小时
发表于 2013-8-26 22:29:19 | 显示全部楼层 |阅读模式
鄙人有一STM32 程序,定义了一个指向 flash中 结构体 数组 的指针。
----------------------
先定义一个结构体数组:
struct  DisplayDot
{
 uint8_t   Dot[16 ]; 
};
---------------------
再定义一个指向该结构体数组的指针:
struct  DisplayDot  const   *pCodeTable;
----------------------
现在*pCodeTable指针的长度是32位的,但这样就与上位机的数据结构 不一样了。(上位机中已规划的指针是16位的,在数据结构中占2字节)
有没有什么办法,把该指针的长度,强制设为16位?

请原子大哥、论坛高人赐教。鄙人感激不尽。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2013-8-22
在线时间
2 小时
 楼主| 发表于 2013-8-26 23:36:15 | 显示全部楼层
常量的绝对定位问题:(定位地址之前,全是0000;定位地址之后,还有其它数据) 


为了更新应用程序的部分功能,我把需要更新的对象做成了一个大的结构体
MachineHeadType(该结构体内含其它结构体、数组、变量等),并把该结构体MachineHeadType定义在了flash的 0x0800 9000处。fficeffice" />

代码如下:

__packed  struct  MachineHeadType   const MachineHead  __attribute__((at(0x8009000))); 

在生成的*.map文件中,看到了代码定位信息:

MachineHead   0x08009000   Data    57  codelocation.o(.ARM.__AT_0x08009000)

这说明该结构体 MachineHead flash中的长度是57个字节。

问题如下:

1、为何在MDK生成的hex文件中,0x08009000 之前,有一大堆的 00 填充?对程序运行有影响吗?能否改为填充FF


2*.map中 显示结构体MachineHead 的长度是57,为什么在生成的 hex 文件中,0x0800 9000后面的 数据,却超过57个呢。 如果我应用程序更新时,重新擦写了0x0800 9000后面这一段,对程序运行有影响吗。
盼高人指教。

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-27 11:27:07 | 显示全部楼层
回复【楼主位】xaitstu:
---------------------------------
你想实现什么样的效果?
在stm32上面,就算u8*也是32位啊...
指针都是32位。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-8-27 11:28:33 | 显示全部楼层
回复【楼主位】xaitstu:
---------------------------------

你上位机用的什么软件 还是16位的?

指针只要不超出地址范围就可用。 

除非是指针数组和多级 指针的指针 进行++或--操作的 时候有区别。 

还是改改上位机吧,换个软件
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-27 11:30:18 | 显示全部楼层
回复【2楼】xaitstu:
---------------------------------
1,是用jtag查看的?这些数据编译器编译后生成的,貌似不能自己修改。
2,可能其他const类型数据被分配到0X08009000后面了。擦除可能导致不可预料的结果。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2013-8-22
在线时间
2 小时
 楼主| 发表于 2013-8-27 12:15:22 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
原子大哥,感谢回复。
我本来的计划是在下位机的0x8009000处,定义一个大的、复杂的数据结构,然后利用上位机单独更新这一段,实现不同的功能。
现在在 数据结构长度、定位处冗余的数据, 这两个方便出现了问题。
---------------------------
1、原来的上位机(delphi)和下位机(8位的)已经定义好了数据结构,现在要重新做下位机,所以暂时考虑先不修改上位机的数据结构。
   现在看来不行了,需要同时修改上位机,因为STM32的指针都是32位的,占用4个字节;而原来的下位机是8位的,指针是16位,最大寻址64k。
   我可以先做的,就是在下位机的数据结构里加入__packed,尽量压缩数据结构的长度,这样上位机的改动很小,只需处理指针长度问题。
2、我把需要更新的常量,放在了0x08009000里,编译生成了hex文件。
   我用周立功烧写器smartpro的配套软件,打开了*.hex文件,看到了在0x80009000处有了我预定位的代码,*.map里也能看到,这说明__attribute__ (at())成功了。
   这与利用fromelf转换后的bin文件,是一致的。
   令人不可理解的是:
   2.1、0x8009000 之前 有很多的 00,为什么不是FF呢。
   2.2、即使我在0x8009000定位1个字节(实际占用32位),在生成的hex文件中,依然可以看到后面还有一串数据。因为我后面要通过上位机擦写这一段,如果0x8009000之后的代码,不是我自己定义的,且含有其它功能,一擦写 不就乱套了吗。
   对于2.2问题,原子大哥也可以自己试一下。
--------------
盼原子大哥  不吝赐教。
回复 支持 反对

使用道具 举报

25

主题

683

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1351
金钱
1351
注册时间
2012-4-25
在线时间
195 小时
发表于 2013-8-27 12:36:56 | 显示全部楼层
回复【6楼】xaitstu:
---------------------------------
stm32 是ARM 32bit 的
1-1
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-27 15:11:17 | 显示全部楼层
回复【6楼】xaitstu:
---------------------------------
1,还是没搞懂你想做什么效果。我觉得和u16,u32指针没什么直接关联,你说数据传输么?传完了直接强制转换就是了,和结构体指针没关系,和结构体成员倒是有关系。你传递的又不是指针,而是数据,也就是结构体里面的数据,你只要数据能对的上,比如都是100个字节,那到哪里,怎么传输,只要不丢数据,那都是100字节,不多 不少。

2,这个我还真没时间去研究,呵呵,比较忙,请见谅。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2013-6-8
在线时间
2 小时
发表于 2013-8-27 16:54:12 | 显示全部楼层
传的是数据,又不是指针,指针是多少位都没关系
即使爬到最高的山上,一次也只能脚踏实地地迈一步。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-14 12:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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