打印
[C语言]

请教:如何给数组分配固定地址?

[复制链接]
3426|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pinelxb|  楼主 | 2014-5-21 13:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
ayb_ice| | 2014-5-21 13:35 | 只看该作者
C语言本身没有这个能力

用汇编,

很多C支持地这个功能扩展,但这要看具体的编译器了

使用特权

评论回复
板凳
pinelxb|  楼主 | 2014-5-21 14:03 | 只看该作者
ayb_ice 发表于 2014-5-21 13:35
C语言本身没有这个能力

用汇编,

我的编译器是ICCAVR,支持吗?再请教一下,这个扩展功能具体怎么实现呢,可以给举个例子吗?

使用特权

评论回复
地板
coody| | 2014-5-21 14:18 | 只看该作者
不明白都用C了,还象汇编一样放绝对地址???

使用特权

评论回复
5
pinelxb|  楼主 | 2014-5-21 14:19 | 只看该作者
coody 发表于 2014-5-21 14:18
不明白都用C了,还象汇编一样放绝对地址???

很简单,因为我要用MODBUS协议通信,所以必须能准确的找到该值存放的地址。

使用特权

评论回复
6
ayb_ice| | 2014-5-21 16:44 | 只看该作者
pinelxb 发表于 2014-5-21 14:03
我的编译器是ICCAVR,支持吗?再请教一下,这个扩展功能具体怎么实现呢,可以给举个例子吗? ...

ICC没有用过,不知道
很多编译用@指定地址


char aa @ 0x10;

KEIL C51扩展了关键字_at_,

char aa _at_ 0x10;

使用特权

评论回复
7
coody| | 2014-5-22 16:11 | 只看该作者
pinelxb 发表于 2014-5-21 14:19
很简单,因为我要用MODBUS协议通信,所以必须能准确的找到该值存放的地址。 ...

我做工业控制几乎都是用的MODBUS协议,PIC、AVR、STC、STM32、LPC2148等等,从来没用过绝对定位的变量。

使用特权

评论回复
8
coody| | 2014-5-22 16:12 | 只看该作者
pinelxb 发表于 2014-5-21 14:19
很简单,因为我要用MODBUS协议通信,所以必须能准确的找到该值存放的地址。 ...

另外,MODBUS协议仅仅是一个软件协议,跟硬件无关的。上位机是电脑的话,也用绝对地址定义么?

使用特权

评论回复
9
rtgchym| | 2014-5-22 17:16 | 只看该作者
pinelxb 发表于 2014-5-21 14:19
很简单,因为我要用MODBUS协议通信,所以必须能准确的找到该值存放的地址。 ...

读写直接对数组的地址进行操作不可以吗,非要指定一个内存地址,这样不同的平台你还要手动去改这个地址?这样也丧失了用C的优势了

使用特权

评论回复
10
lr2131| | 2014-5-23 09:55 | 只看该作者
我记得IAR是可以的,在C文件中定义,然后在分散加载脚本中指定地址就可以。
MDK还有其他的工具没怎么研究过,不过我基本能确定,能用到分撒加载脚本的编译器都是支持的。

使用特权

评论回复
11
lininglive| | 2014-5-23 10:11 | 只看该作者
指针是干嘛的

使用特权

评论回复
12
grasswolfs| | 2014-5-23 10:20 | 只看该作者
modbus为什么要用绝对地址~

使用特权

评论回复
13
pinelxb|  楼主 | 2014-5-27 08:22 | 只看该作者
coody 发表于 2014-5-22 16:12
另外,MODBUS协议仅仅是一个软件协议,跟硬件无关的。上位机是电脑的话,也用绝对地址定义么? ...

例如用MODBUS协议控制电源电压,你发一个电压值,是需要写到存放电压值的这个地址吧。没有地址的话,那么接收到的数据放在哪里呢?虚心请教。。。

使用特权

评论回复
14
pinelxb|  楼主 | 2014-5-27 08:23 | 只看该作者
ayb_ice 发表于 2014-5-21 16:44
ICC没有用过,不知道
很多编译用@指定地址

谢谢您的答复

使用特权

评论回复
15
coody| | 2014-5-27 11:17 | 只看该作者
pinelxb 发表于 2014-5-27 08:22
例如用MODBUS协议控制电源电压,你发一个电压值,是需要写到存放电压值的这个地址吧。没有地址的话,那么 ...

比如我提供100个寄存器访问,用数组unsigned int dat[100],假如MODBUS访问的寄存器地址是0x1000开始,并且电压放在0x1005,则就是在dat[5],明白了吧?

使用特权

评论回复
16
gx_huang| | 2014-5-27 12:54 | 只看该作者
如果用汇编的思路设计C程序,自然就有这样可笑的想法。

使用特权

评论回复
17
coody| | 2014-5-27 17:16 | 只看该作者
楼上说得对。。。用C,就尽量不要使用绝对地址定位(外部总线接口的器件访问除外)

使用特权

评论回复
18
yewuyi| | 2014-5-27 22:38 | 只看该作者
gx_huang 发表于 2014-5-27 12:54
如果用汇编的思路设计C程序,自然就有这样可笑的想法。

不要这么讲呃。

。。。。。。根本没有汇编或者C的程序思路之分。

我见到的C编译器基本也都是支持绝对定位的,当然,绝对定位是否有意义?这是另外一个话题。

KEIL、IAR、PICC、COSMIC,warrior等等都支持。

使用特权

评论回复
19
yewuyi| | 2014-5-27 22:38 | 只看该作者
gx_huang 发表于 2014-5-27 12:54
如果用汇编的思路设计C程序,自然就有这样可笑的想法。

不要这么讲呃。

。。。。。。根本没有汇编或者C的程序思路之分。

我见到的C编译器基本也都是支持绝对定位的,当然,绝对定位是否有意义?这是另外一个话题。

KEIL、IAR、PICC、COSMIC,warrior等等都支持。

使用特权

评论回复
20
gx_huang| | 2014-5-28 09:04 | 只看该作者
yewuyi 发表于 2014-5-27 22:38
不要这么讲呃。

。。。。。。根本没有汇编或者C的程序思路之分。

简单的汇编,事先都定义变量的地址。估计LZ用的汇编就是这个。
高级一点的宏汇编,变量地址不是事先定义的。
我也用过C语言的变量地址定位,主要是实现某些特殊功能。
比如充分利用C51前面的一个没有用到的RAM区域,一般是BANK1-3的24个字节。
比如C和汇编嵌套使用,地址固定了,汇编好处理。

使用特权

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

本版积分规则

8

主题

50

帖子

2

粉丝