打印
[STM8]

IAR FOR STM8 指针等

[复制链接]
7057|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 明月小厨 于 2012-12-12 14:42 编辑

问题的提出:
用过KEIL C51的都非常熟悉C51的指针及数据类型,数据存放的区域等;
但这一切在不太熟悉的IAR FOR STM8中一时半会找不着北了;
其实KEIL想到的 IAR也一样想的到;看看IAR是怎么处理的吧;
欢迎各位老师和同学们批评指正:)

把相关的问题弄明白了,数据放在哪,怎么访问,都不是问题了;:victory:

沙发
明月小厨|  楼主 | 2012-12-12 12:35 | 只看该作者
USING DATA MEMORY ATTRIBUTES
The compiler provides a set of extended keywords, which can be used as data memory
attributes. These keywords let you override the default memory type for individual data
objects and pointers, which means that you can place data objects in other memory areas
than the default memory. This also means that you can fine-tune the access method for
each individual data object, which results in smaller code size.
This table summarizes the available memory types and their corresponding keywords:
不看这些废话,上图表

使用特权

评论回复
板凳
明月小厨|  楼主 | 2012-12-12 12:39 | 只看该作者

使用特权

评论回复
地板
明月小厨|  楼主 | 2012-12-12 12:42 | 只看该作者
上图说明了存储区的类型;地址范围,指针的大小,关键字;以及系统编译器对应的处理方式;

使用特权

评论回复
5
明月小厨|  楼主 | 2012-12-12 12:50 | 只看该作者
例:
__tiny int i, j;
int __tiny k, l;


第一句的意思是告诉编译器,i,j是整型变量,放在tiny区域;
第二句的意思也是一样的;
tiny的空间是0-0xFF;

使用特权

评论回复
6
明月小厨|  楼主 | 2012-12-12 12:54 | 只看该作者
本帖最后由 明月小厨 于 2012-12-12 14:43 编辑

下一步复杂些了,问题也多出来了;指针
char __far * __tiny myPtr;
char 是指针指向的对象是什么数据类型;
__far 是指针针向的对象在哪个区域;
__tiny 指针自己放在什么区域;
和KEIL是不是有些相似啊~~~~~~~

使用特权

评论回复
7
明月小厨|  楼主 | 2012-12-12 13:00 | 只看该作者
本帖最后由 明月小厨 于 2012-12-12 13:05 编辑

当然你的数据指针,指向的不一定是char,也许是数组,也许是其它什么,如函数入口;怎么办呢?
下次继续讨论,

其中指向函数的指针有些特别;:):lol 不象KEIL有一种万能的指针;
在这里需要你帮助IAR编译器,让IAR正确理解你的意图.

使用特权

评论回复
8
明月小厨|  楼主 | 2012-12-12 13:13 | 只看该作者
/* Defines via a typedef */
typedef char __tiny Byte;
typedef Byte *BytePtr;
Byte aByte;
BytePtr aBytePointer;

小测验;上面这一段代码你看明白没有?能看明白的继续往下看...

使用特权

评论回复
9
明月小厨|  楼主 | 2012-12-12 13:14 | 只看该作者
/* 答案在这 */
__tiny char aByte;
char __tiny * aBytePointer;

使用特权

评论回复
10
明月小厨|  楼主 | 2012-12-12 13:22 | 只看该作者
本帖最后由 明月小厨 于 2012-12-12 13:24 编辑

int myA;      
int  __near   myB;      
__tiny  int    myC;         
int  *   myD;      
int  __near *  myE;
int  __near   *   __tiny     myF;
继续复习...看明白每一句的含义;你能看的懂,编译器也能.否则...

使用特权

评论回复
11
明月小厨|  楼主 | 2012-12-12 13:26 | 只看该作者
int __tiny * MyFunction(int __near *);
这是什么意思?请思考(附加题)

使用特权

评论回复
12
明月小厨|  楼主 | 2012-12-12 14:12 | 只看该作者

我在使用特殊paste的时候才发现,都藏在这里了;
“众里寻她千百度,蓦然回首,那人却在灯火阑珊处”
惭愧了

使用特权

评论回复
13
明月小厨|  楼主 | 2012-12-12 14:26 | 只看该作者
void (__far_func * fp)();
fp = myfun;
(*fp)();

函数指针部分就这样吧,myfun是你自己的某一个函数;
第一句是声明一个函数指针;
第二是给指针赋值(指向某函数);
第三句是通过指针调用这个函数;

学会这个可以大幅精减你的程序结构;
状态机你知道的;用这个就象是状态机似的运行.
再下一步,可以把函数象中断向量表一样排成一串,组成数组;

使用特权

评论回复
14
chenbb8| | 2012-12-12 21:58 | 只看该作者
:loveliness:
我看别人写的状态机架构里,为了通用性,这种编译器自定义的语法都是用宏来替换掉了。
比如,像你的
#ifndef FAR_FUNC
#define FAR_FUNC __far_func
#endif

在cosmic的环境下直接修改成,就没问题了。
#ifndef FAR_FUNC
#define FAR_FUNC
#endif

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
明月小厨 + 2 赞一个!
15
明月小厨|  楼主 | 2012-12-12 23:50 | 只看该作者
本帖最后由 明月小厨 于 2012-12-12 23:51 编辑

typedef
在这个场合下经常用;每行的代码短些,清爽些;


使用特权

评论回复
16
明月小厨|  楼主 | 2013-11-5 14:20 | 只看该作者
这么好的贴竟然没有引起大家关注.:(

使用特权

评论回复
17
fwar34| | 2013-11-5 21:07 | 只看该作者
学习了%%%%%%%%%%%%%%

使用特权

评论回复
18
hithms| | 2013-11-5 23:40 | 只看该作者
关注下,呵呵

使用特权

评论回复
19
chzfmx| | 2013-11-23 22:39 | 只看该作者
我在IAR里做测试是这么写的:
unsigned char __far *p ;
main()
{
    while(1)
    {
      p++;
   }
}
指针p最多还是只能指到地址0xffff,怎么才能指到0xffff之后的地址呢?

使用特权

评论回复
20
armauk| | 2014-3-31 11:14 | 只看该作者
查了很长时间才找到这里,关于这方面的太少了

使用特权

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

本版积分规则

个人签名:爱你一万年

35

主题

1072

帖子

2

粉丝