发新帖我要提问
12
返回列表
打印

指针和字符串那点事--C语言功底不扎实的勿进

[复制链接]
楼主: armmage
手机看帖
扫描二维码
随时随地手机跟帖
21
可以指定各种变量存放位置的. 如ADS环境下可以通过修改分散加载文件来确定常量的存放位置.
一般情况下, 如果你RAM空间不是很充足, 常量还是放在FLASH好, LZ这种书写方法本身就不是很合理, 你应该尽量想办法写出不依赖编译器的程序.

使用特权

评论回复
22
batsong| | 2010-11-12 14:13 | 只看该作者
IAR的帮助文档

location
Syntax
#pragma location={address|NAME}
Parameters

address  The absolute address of the global or static variable for which you want an absolute location.  
NAME  A user-defined segment name; cannot be a segment name predefined for use by the compiler and linker.  


Description
Use this pragma directive to specify the location—the absolute address—of the global or static variable whose declaration follows the pragma directive. The variable must be declared either __no_init or const. Alternatively, the directive can take a string specifying a segment for placing either a variable or a function whose declaration follows the pragma directive.

Example
#pragma location=0x22E
__no_init volatile char PORT1; /* PORT1 is located at address
                                  0x22E */

#pragma location="foo"  
char PORT1; /* PORT1 is located in segment foo */

/* A better way is to use a corresponding mechanism */
#define FLASH _Pragma("location=\"FLASH\"")
...
FLASH int i; /* i is placed in the FLASH segment */
See also
For additional information and examples, see the MSP430 IAR C/C++ Compiler Reference Guide.

使用特权

评论回复
23
zhiyonghe| | 2010-11-12 15:28 | 只看该作者
真给力
值得细细拜读

使用特权

评论回复
24
armmage|  楼主 | 2010-11-12 16:02 | 只看该作者
淡定的表示 被楼上几位调戏了

使用特权

评论回复
25
armmage|  楼主 | 2010-11-12 16:05 | 只看该作者
话说最近考虑换一款编译器 包罗ARM7 ARM9 M3核,不知道选IAR好还是MDK好,个人倾向MDK,毕竟感觉是ADS投胎转世。

使用特权

评论回复
26
xinzha| | 2010-11-12 16:16 | 只看该作者
const和ram并没有对立关系。
跟const相对的是RW data和BSS等,const属于RO data。
只要你控制好系统和分散加载文件,ro data和ro code一样放在ram里,只是在没有MPU/MMU的系统里这么做会有很大风险。

使用特权

评论回复
27
armmage|  楼主 | 2010-11-12 17:02 | 只看该作者
xinzha兄 我也是这么想的 不知道 IAR for ARM 和 MDK 是否也支持想ADS一样爽的分散加载,最近想换编译器么,还有 M3不知道是否支持此功能,其实分散加载 很好很强大

使用特权

评论回复
28
刘前辈| | 2010-11-12 17:51 | 只看该作者
本帖最后由 刘前辈 于 2010-11-12 17:57 编辑

书上写的挺清楚的。
如果不需要确定地址,只想在 FLASH 中分配一个变量,则形式为:
const [数据类型] 变量名;
举例:  
const unsigned int MoonRiver =100;

使用特权

评论回复
29
刘前辈| | 2010-11-12 18:08 | 只看该作者
本帖最后由 刘前辈 于 2010-11-12 18:12 编辑
这种不同的编译器产生的代码默认定位问题是否有办法修改,我查过IAR的用户手册,没有办法做到控制"123"字符串的位置。



按照编译器手册,以下将“123”字符串定位在flash区。
const  char *p = "123";

p 指针默认位置,应该是RAM区:不妨也写成:
const  char *const p = "123";   // 试试玩

使用特权

评论回复
30
armmage|  楼主 | 2010-11-12 21:34 | 只看该作者
额 前辈貌似没看清楚我们前面讨论的
const 只能说定义为只读,是否在flash中 就看编译器了,反正ADS是这样,一般const他能放flash就放flash
你举例说的书上例子,那是定义普通变量,而且不一定是在flash中,要用IAR的关键字 __flash  话说用编译器关键字不太好,移植问题。
const  char *p = "123";
我在IAR FOR AVR试过 "123" 在RAM中

使用特权

评论回复
31
armmage|  楼主 | 2010-11-12 21:35 | 只看该作者
xinzha 用MDK的 还是IAR的?

使用特权

评论回复
32
xinzha| | 2010-11-13 12:40 | 只看该作者
我用的RVDS,跟ADS在这些方面上基本是一致的。
IAR还真没使用过,推测一定会有分散加载功能,否则没法卖。

使用特权

评论回复
33
armmage|  楼主 | 2010-11-16 18:42 | 只看该作者
哎 忙几天搞忘记了 话说RVDS 是硬件开发型的 软件开发貌似是MDK 这个我去官网上看过

使用特权

评论回复
34
yalingcat| | 2010-11-17 10:14 | 只看该作者
真长啊

使用特权

评论回复
35
tuzihog| | 2011-10-21 20:06 | 只看该作者
真给力
值得细细拜读

使用特权

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

本版积分规则