打印
[C语言]

c问题

[复制链接]
1328|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
idqiye|  楼主 | 2015-11-5 15:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想定义一个数组到固定地址处,比方说0x3000
但是会遇到以下问题
比如当你把指针指向0X3000时,预想使用空间长度0X1000
在写C时 假如声明了别的变量或数据,C编译器会把他分配到为使用的空间
这些空间就可能包括了0X3000-0X4000
这个问题如何解决?就是保证我固定地址处的空间,不被程序的其它变量和数据利用?

相关帖子

沙发
ayb_ice| | 2015-11-5 15:28 | 只看该作者
标准的C无法指定变量地址

可以通过汇编处理,C声明就可以了

有些编译器提供指定地址功能,这要看具体说明了

使用特权

评论回复
板凳
coody| | 2015-11-5 15:47 | 只看该作者
典型的用汇编思想来用C。。。。
用C语言,就 不要定义绝对地址的变量。

使用特权

评论回复
地板
idqiye|  楼主 | 2015-11-5 15:49 | 只看该作者
coody 发表于 2015-11-5 15:47
典型的用汇编思想来用C。。。。
用C语言,就 不要定义绝对地址的变量。

我用在单片机上,但实际却是需要这么做,没其它办法了么

使用特权

评论回复
5
ayb_ice| | 2015-11-5 15:53 | 只看该作者
idqiye 发表于 2015-11-5 15:49
我用在单片机上,但实际却是需要这么做,没其它办法了么

什么MCU,什么编译器

使用特权

评论回复
6
idqiye|  楼主 | 2015-11-5 15:58 | 只看该作者
ayb_ice 发表于 2015-11-5 15:53
什么MCU,什么编译器

51内核的,keil

使用特权

评论回复
7
ayb_ice| | 2015-11-5 16:00 | 只看该作者

51简单

char xdata array[100] _at_ 0x100;  // 此处不可以初始化

使用特权

评论回复
8
idqiye|  楼主 | 2015-11-5 16:15 | 只看该作者
ayb_ice 发表于 2015-11-5 16:00
51简单

char xdata array[100] _at_ 0x100;  // 此处不可以初始化

谢谢,再问一下,keil编译的时候,data是不是默认从低地址到高地址使用,比方说我写了一个程序,编译后xdata是200,那么是不是在程序运行时xdata300处一定用不到?

使用特权

评论回复
9
ayb_ice| | 2015-11-5 16:23 | 只看该作者
idqiye 发表于 2015-11-5 16:15
谢谢,再问一下,keil编译的时候,data是不是默认从低地址到高地址使用,比方说我写了一个程序,编译后xd ...

一般情况是这样的

这个不用担心,只要不报错,不报警告是没有问题的,

指定的地址不会被覆盖的,哪怕是从0开始指定地址(寄存器区间除外)

使用特权

评论回复
10
idqiye|  楼主 | 2015-11-5 16:41 | 只看该作者
ayb_ice 发表于 2015-11-5 16:23
一般情况是这样的

这个不用担心,只要不报错,不报警告是没有问题的,

如果我想根据编译结果看看,我xdata用了多少,keil编译后,信息框里显示用了多少xdata,包括不包括程序里,函数里的局部变量?

使用特权

评论回复
11
ayb_ice| | 2015-11-5 16:54 | 只看该作者
idqiye 发表于 2015-11-5 16:41
如果我想根据编译结果看看,我xdata用了多少,keil编译后,信息框里显示用了多少xdata,包括不包括程序里 ...

包括所有分配的

强制转换的肯定是不知道的

使用特权

评论回复
12
冰零分子| | 2015-11-5 17:06 | 只看该作者
ayb_ice 发表于 2015-11-5 16:00
51简单

char xdata array[100] _at_ 0x100;  // 此处不可以初始化

又长知识了:D

使用特权

评论回复
13
ayb_ice| | 2015-11-5 17:12 | 只看该作者

其实很多编译器都提供绝对定位功能,只是用法不一样而已,毕竟不是C标准的东西

使用特权

评论回复
14
冰零分子| | 2015-11-5 17:19 | 只看该作者
ayb_ice 发表于 2015-11-5 17:12
其实很多编译器都提供绝对定位功能,只是用法不一样而已,毕竟不是C标准的东西 ...

高手就是不仅研究的深,还通晓的广
向您学习:D

使用特权

评论回复
15
ayb_ice| | 2015-11-5 17:25 | 只看该作者
冰零分子 发表于 2015-11-5 17:19
高手就是不仅研究的深,还通晓的广
向您学习

C51还有另外一种方法,通过连接器指定段地址来绝对定位,不过稍复杂点,看手册就会用的

使用特权

评论回复
16
zyj9490| | 2015-11-5 22:37 | 只看该作者
在KEIL 有IRAM的指定,让目标区哉内,不要包括,即可,变量就不会分配到那里,这样可以在代码里操作。

使用特权

评论回复
17
ticomi| | 2015-11-6 08:27 | 只看该作者
这个可以做到的,看下KEIL的使用说明,其中有介绍。我使用IAR,做这样的事情,非常简单!

使用特权

评论回复
18
idqiye|  楼主 | 2015-11-6 09:32 | 只看该作者
ticomi 发表于 2015-11-6 08:27
这个可以做到的,看下KEIL的使用说明,其中有介绍。我使用IAR,做这样的事情,非常简单! ...

你说的keil说明,就keil操作手册呗

使用特权

评论回复
19
diweo| | 2015-11-6 10:09 | 只看该作者
coody 发表于 2015-11-5 15:47
典型的用汇编思想来用C。。。。
用C语言,就 不要定义绝对地址的变量。

在嵌入式领域,绝对地址有时还是挺有用的。

使用特权

评论回复
20
ayb_ice| | 2015-11-6 10:17 | 只看该作者
diweo 发表于 2015-11-6 10:09
在嵌入式领域,绝对地址有时还是挺有用的。

当然了,不然编译器也不会去支持这些

flash当EEPROM使用就需要绝对定位

使用特权

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

本版积分规则

61

主题

346

帖子

3

粉丝