打印

STVD自动生成的stm8_interrupt_vector.c中几个疑问

[复制链接]
楼主: yewuyi
手机看帖
扫描二维码
随时随地手机跟帖
41
yewuyi|  楼主 | 2009-11-6 16:56 | 只看该作者 回帖奖励 |倒序浏览
明天开始看COSMIC的两个编译器手册。。。

哈哈,估计又是一大堆问题上来晕乎。。。

使用特权

评论回复
42
香水城| | 2009-11-6 17:00 | 只看该作者
ST干吗不定义一个指令助记符?又不要成本;P
mcuisp 发表于 2009-11-6 16:26


我的理解是,这条指令因为只能用在中断向量表中,而不能用在其它地方,是否为它定义一个助记符并不重要。

如果定义了助记符,是否就意味着可以用在其它地方,如果不明就里的人在写程序时,尤其是写汇编程序时,使用了这条指令,那样不是会产生更大的麻烦?所以似乎不给它定义一个指令助记符是更好的选择。

使用特权

评论回复
43
mcuisp| | 2009-11-6 17:52 | 只看该作者
呵呵,初用ST芯片的,都会有少少不习惯。
ST芯片很多观念与美系不一样。

使用特权

评论回复
44
yewuyi|  楼主 | 2009-11-12 10:38 | 只看该作者
请问香水城主,COSMIC编译器是否支持变量地址的绝对定位?!

使用特权

评论回复
45
香水城| | 2009-11-12 10:52 | 只看该作者
请问香水城主,COSMIC编译器是否支持变量地址的绝对定位?!
yewuyi 发表于 2009-11-12 10:38


可以呀,C语言能够访问所有的硬件寄存器,他们的地址都是绝对定位的。具体如何操作我不是很清楚。

除了硬件寄存器外,好像没有必要对变量地址进行绝对定位吧?有什么特别的需要吗?

使用特权

评论回复
46
yewuyi|  楼主 | 2009-11-12 11:11 | 只看该作者
硬件寄存器可以绝对地址访问,COSMIC给出了@,例如 volatile char  PORTB @0x10;
但寄存器和变量存放的RAM不一样啊,我定义变量时使用类似方式进行绝对地址定位是不可以的 。

使用特权

评论回复
47
grant_jx| | 2009-11-12 11:13 | 只看该作者
申明的时候用@,或是申明一批,然后用Segment定位开始地址即可。

这几天给Microchip的Master折腾的要死。

使用特权

评论回复
48
yewuyi|  楼主 | 2009-11-12 11:27 | 只看该作者
LS能否给出例子?

使用@时,其后面不就是定位的地址吗?如何使用segment再定位地址?

我尝试了一下,使用@绝对定位变量没有完全成功,char i @0xfe;-->这样可以成功。
char i=0 @0xfe;则失败,这意味着不可以赋初值?!有什么办法绝对定位的同时赋初值成功?!

呵呵,grant_jx,你们不是只做ST的吗?什么时候操心MCHP的MASTER了?!

使用特权

评论回复
49
grant_jx| | 2009-11-12 13:41 | 只看该作者
[img][/img]下午要出去,打字慢,先讲segment的用法。 我们可以用segment关键字将一段代码或申明的变量地位在一个特定的区域。要使用这要的办法,需要现在mapping.asm(针对汇编,C的话就是lkf)申明一个自定义段。比如我要申明一个mysegment {},放在ROM区域,里面打算放数组也好、代码的二进制文件也好,用户自己定。 对于汇编 ,打开mapping.asm: stm8/ ;------------------------------------------------------ ; SEGMENT MAPPING FILE AUTOMATICALLY GENERATED BY STVD ; SHOULD NOT BE MANUALLY MODIFIED. ; CHANGES WILL BE LOST WHEN FILE IS REGENERATED. ;------------------------------------------------------ #include "mapping.inc" BYTES ; The following addresses are 8 bits long segment byte at ram0_segment_start-ram0_segment_end 'ram0' WORDS ; The following addresses are 16 bits long segment byte at ram1_segment_start-ram1_segment_end 'ram1' WORDS ; The following addresses are 16 bits long segment byte at stack_segment_start-stack_segment_end 'stack' WORDS ; The following addresses are 16 bits long segment byte at 4000-45FF 'eeprom' WORDS ; The following addresses are 16 bits long segment byte at 8080-17FFF 'rom' WORDS ; The following addresses are 16 bits long segment byte at 8000-807F 'vectit' END ---------------------- WORDS ; The following addresses are 16 bits long segment byte at 8080-17FFF 'rom' 我们需要在ROM区添加一个段叫mysegment,地址在0xFF00到0xFFF0区域,我们自己手动添加这个段: WORDS ; The following addresses are 16 bits long segment byte at FF00-FFF0 'mysegment' 将上面的内容添加到ROM之后,Vectit之前(你现在明白之前为什么在C中中断向量 veciti 只是一个符合,而不是地址的定位了吧?)。保存。还有一种快速的方法是在STVD下使用IDE的界面,项目Project-Setting - ST Link里面改。 结果看截图:

使用特权

评论回复
50
grant_jx| | 2009-11-12 13:49 | 只看该作者
本帖最后由 grant_jx 于 2009-11-12 13:57 编辑

什么啊,怎么排好的版成了这个德性,算了,回头我在自己的bolg上更新吧。

做得太杂了,仅MCU这块除ST,还有Microchip的(除去PIC32,其它基本没精力关心了)、TOSHIBA 的Cortex M3,个人感觉纯一个打杂的。


刚看到的一个网友上传上来的一个ST的中文笔记,上面也有这一部分。补上:
unsigned char temp_A@0x00; //定义无符号变量temp_A,强制其地址为0x00
unsigned char temp_B@0x100; //定义无符号变量temp_B,强制其地址为0x100
@tiny unsigned char temp_C; //定义无符号变量temp_C,由编译器自动在地址小于0x100的RAM中为其分配一个地址
@near unsigned char temp_D; //定义无符号变量temp_D,由编译器自动在地址大于0xFF的RAM中为其分配一个地址

使用特权

评论回复
51
yewuyi|  楼主 | 2009-11-12 15:06 | 只看该作者
segment的用法还是知道的,各个编译器大同小异,我理解错了你47楼的发言,还因为结合使用segment和@来实现对变量的绝对定位呢,如果这样就很异样了。

我在44楼没把问题说清楚,使用@绝对定位变量是可以的,我一开始就测试通过了,但赋初值就出错了,例如:
unsigned char temp_A@0x00; //定义无符号变量temp_A,强制其地址为0x00
但不能写成:unsigned char temp_A=0@0x00; //定义无符号变量temp_A,强制其地址为0x00
这点和IAR的编译器一样,以前使用IAR FOR AVR的时候,好象也不能赋初值,呵呵,一直想弄明白不能赋初值的原因是什么?!

使用特权

评论回复
52
today_lucky| | 2011-6-29 11:46 | 只看该作者
留个记号???这里的帖子会不会被删掉? 那样的话 我就转载了?

使用特权

评论回复
53
5_0_5| | 2011-7-23 00:04 | 只看该作者
正迷茫呢,学习

使用特权

评论回复
54
jack_icc| | 2012-10-12 10:10 | 只看该作者
MARK:)

使用特权

评论回复
55
lsj19851118| | 2013-1-23 21:53 | 只看该作者
roalychen 发表于 2009-11-3 17:24
一:typedef void @far (*interrupt_handler_t)(void);
我觉得是void @far -->(*interrupt_handler_t)(void ...

我也遇到同样的问题,每次单片机重新上电后,程序就不断的进入@far @interrupt void NonHandledInterrupt (void)
{
/* in order to detect unexpected events during development,
    it is recommended to set a breakpoint on the following instruction
*/
return;
}这个中断函数中,得等好长时间才能退出来,现在一点头绪也没有了?

使用特权

评论回复
56
xielong4183| | 2013-4-19 17:30 | 只看该作者
踩一脚,空了接着看。

使用特权

评论回复
57
cjhk| | 2013-4-19 18:49 | 只看该作者
学习帖子  仔细看了看   感觉还是很不错的   谢谢楼主  谢谢   需要好好玩玩   学习学习   谢谢

使用特权

评论回复
58
fzh288| | 2013-4-26 10:29 | 只看该作者

使用特权

评论回复
59
AI_YSD| | 2013-4-27 16:02 | 只看该作者
很好的帖子,学习了

使用特权

评论回复
60
oppddo| | 2013-8-13 20:29 | 只看该作者
最近开始学STM8,这个是很好的学习帖子啊,,非常感谢

使用特权

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

本版积分规则