打印

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

[复制链接]
楼主: yewuyi
手机看帖
扫描二维码
随时随地手机跟帖
21
yewuyi|  楼主 | 2009-11-5 17:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览

~~

本帖最后由 yewuyi 于 2009-11-5 17:19 编辑

呵呵,肯定需要的。
第一:你确认了,我才放心
第二:还有很多新冒出的问题还没得到答案,那都是在后面跟贴新提出来的。
第三:各种回答有很多种,总需要一个人给出一个最最准确的答案。

:),俺经常性的自问自答,但没有确认一下答案,自己有时也弄不清楚到底对了还是错了,呵呵,基础不牢,信心不足的典型表现啊,俺现在只是把芯片的DATASHEET扫了一遍,具体芯片有什么资源对俺来说并不太关键,呵呵,那些东西总能自己对着DATASHEET看明白的,主要是C编译器和一些电器指标等需要慢慢弄透弄清楚,否则批量产品出去了,我的责任就大了。。。

使用特权

评论回复
22
香水城| | 2009-11-5 18:23 | 只看该作者
继续10楼的帖子:

如果结合看第2个问题和第5个问题就容易了,第5个问题是定义了一个结构数组,这个结构就是第2个问题中定义的结构interrupt_vector,这里定义结构数组的同时,对这个结构数组进行了初始化,以后的每行都是数组中的一个分量。

就以数组中的第2行为例:
{0x82, NonHandledInterrupt}, /* trap  */
0x82对应结构的第1个分量unsigned char interrupt_instruction,这正是你的第2个问题中找不到在哪里用到的东西。
NonHandledInterrupt对应结构的第2个分量interrupt_handler_t interrupt_handler,而这个分量的类型正好是你的第1个问题中定义的指针类型,它是一个指向函数的指针,这里把这个指针初始化为指向NonHandledInterrupt函数,即你的第3个问题中提到的函数。

你的第3个问题中提到的函数,它内部除了一句return也什么也没有,这是为了在你没有定义它的内容时的一个默认动作,通常你需要自己定义每个处理函数的动作,然后在初始化数组_vectab[]的时候,用自己的函数名替换掉那个默认的函数NonHandledInterrupt

最后关于你的第4个问题:_stext()似乎是一个汇编函数,是由编译器提供的,它的目的是在芯片复位后至进入你的main()之前,编译器需要进行一些预处理动作,如初始化某些编译器需要用到的变量等,具体有哪些内容,我没有看过,不太清楚。你可以不必理会它在哪里,它做什么。





struct { unsigned char interrupt_instruction; interrupt_handler_t interrupt_handler; };

使用特权

评论回复
23
yewuyi|  楼主 | 2009-11-6 08:29 | 只看该作者
呵呵,grant_jx教育的极是,俺只是查了查手册,上面没有看到汇编指令集就跳过了,呵呵,现在一些新出的芯片都不给看指令集,俺就认为暂时看不看也无所谓了。。。 1、从lkf命令文件中还是看不到_vectab[]的连接定位, ...
yewuyi 发表于 2009-11-5 09:43


这一层的问题还没得到答案呢。。。

使用特权

评论回复
24
香水城| | 2009-11-6 08:42 | 只看该作者
首先声明,俺是动口不动手,具体这个_vectab[]是如何被分配的,不是十分清楚。

其次,我认为作为初学者,先可不必搞清楚这个问题,不会影响芯片的使用。

第3,如果一点要知道它是如何被分配的,则简单的办法是搜索一下项目中的所有文件,找到所有出现这个关键字的地方,然后找到它们相互的联系。

使用特权

评论回复
25
yewuyi|  楼主 | 2009-11-6 09:13 | 只看该作者
呵呵,请问香水城主,有别的什么途径搞清楚这些问题吗?好象结合STVD和COSMIC编译器的深入讲解清楚应用笔记很少啊,呵呵,GOOGLE到的和网站上DOWN到的资料几乎都是千篇一律的如何建立PROJET就OVER了。。。

期待更深入的应用笔记出场。。。

使用特权

评论回复
26
stm_zy| | 2009-11-6 13:17 | 只看该作者
我今天也着手学习中断了。用TIM2的中断处理进行led闪烁显示,结果LED停在了一个状态不动了,很郁闷。

使用特权

评论回复
27
yewuyi|  楼主 | 2009-11-6 15:07 | 只看该作者
关于__vectab,找到了一个‘最可信’的答案,请ST的各位大佬指正:
如附件两个图,从编译后生成的MAP文件看,__vectab被定位到0X8000地址,在lkf文件和其它所有文件中没有找到__vectab,但从图2的vector file name和vector addre对话框内的内容看,stm8_interrupt_vector.c这个文件名应该任意修改,但项目建立的时候应该默认的是这个文件名,只要把vector file name中文件修改为和重起的文件名字一致应该也没问题,但估计__vectab应该是个关键字,直接对应到了vector addre,不可修改。
关于0x82的问题,根据stm8_interrupt_vector.ls这个文件中的内容看:

  48  0000               __vectab:
  49  0000 82             dc.b 130
  51  0001 00             dc.b page(__stext)
  52  0002 0000           dc.w __stext
  53  0004 82             dc.b 130
  55  0005 00             dc.b page(f_NonHandledInterrupt)
  56  0006 0000           dc.w f_NonHandledInterrupt
  57  0008 82             dc.b 130
  59  0009 00             dc.b page(f_NonHandledInterrupt)
  60  000a 0000           dc.w f_NonHandledInterrupt
  61  000c 82             dc.b 130
  63  000d 00             dc.b page(f_NonHandledInterrupt)
  64  000e 0000           dc.w f_NonHandledInterrupt
  65  0010 82             dc.b 130
  67  0011 00             dc.b page(f_NonHandledInterrupt)
  68  0012 0000           dc.w f_NonHandledInterrupt
  69  0014 82             dc.b 130
  71  0015 00             dc.b page(f_NonHandledInterrupt)
  72  0016 0000           dc.w f_NonHandledInterrupt
  73  0018 82             dc.b 130
  75  0019 00             dc.b page(f_NonHandledInterrupt)
  76  001a 0000           dc.w f_NonHandledInterrupt
  77  001c 82             dc.b 130
  79  001d 00             dc.b page(f_NonHandledInterrupt)
  80  001e 0000           dc.w f_NonHandledInterrupt
  81  0020 82             dc.b 130
  83  0021 00             dc.b page(f_NonHandledInterrupt)
  84  0022 0000           dc.w f_NonHandledInterrupt
  85  0024 82             dc.b 130
  87  0025 00             dc.b page(f_NonHandledInterrupt)
  88  0026 0000           dc.w f_NonHandledInterrupt
  89  0028 82             dc.b 130
  91  0029 00             dc.b page(f_NonHandledInterrupt)
  92  002a 0000           dc.w f_NonHandledInterrupt
  93  002c 82             dc.b 130
  95  002d 00             dc.b page(f_NonHandledInterrupt)
  96  002e 0000           dc.w f_NonHandledInterrupt
  97  0030 82             dc.b 130
  99  0031 00             dc.b page(f_NonHandledInterrupt)
100  0032 0000           dc.w f_NonHandledInterrupt
101  0034 82             dc.b 130
103  0035 00             dc.b page(f_NonHandledInterrupt)
104  0036 0000           dc.w f_NonHandledInterrupt
105  0038 82             dc.b 130
107  0039 00             dc.b page(f_NonHandledInterrupt)
108  003a 0000           dc.w f_NonHandledInterrupt
109  003c 82             dc.b 130
111  003d 00             dc.b page(f_NonHandledInterrupt)
112  003e 0000           dc.w f_NonHandledInterrupt
113  0040 82             dc.b 130
115  0041 00             dc.b page(f_NonHandledInterrupt)
116  0042 0000           dc.w f_NonHandledInterrupt
117  0044 82             dc.b 130
119  0045 00             dc.b page(f_NonHandledInterrupt)
120  0046 0000           dc.w f_NonHandledInterrupt
121  0048 82             dc.b 130
123  0049 00             dc.b page(f_NonHandledInterrupt)
124  004a 0000           dc.w f_NonHandledInterrupt
125  004c 82             dc.b 130
127  004d 00             dc.b page(f_NonHandledInterrupt)
128  004e 0000           dc.w f_NonHandledInterrupt
129  0050 82             dc.b 130
131  0051 00             dc.b page(f_NonHandledInterrupt)
132  0052 0000           dc.w f_NonHandledInterrupt
133  0054 82             dc.b 130
135  0055 00             dc.b page(f_NonHandledInterrupt)
136  0056 0000           dc.w f_NonHandledInterrupt
137  0058 82             dc.b 130
139  0059 00             dc.b page(f_NonHandledInterrupt)
140  005a 0000           dc.w f_NonHandledInterrupt
141  005c 82             dc.b 130
143  005d 00             dc.b page(f_NonHandledInterrupt)
144  005e 0000           dc.w f_NonHandledInterrupt
145  0060 82             dc.b 130
147  0061 00             dc.b page(f_NonHandledInterrupt)
148  0062 0000           dc.w f_NonHandledInterrupt
149  0064 82             dc.b 130
151  0065 00             dc.b page(f_NonHandledInterrupt)
152  0066 0000           dc.w f_NonHandledInterrupt
153  0068 82             dc.b 130
155  0069 00             dc.b page(f_NonHandledInterrupt)
156  006a 0000           dc.w f_NonHandledInterrupt
157  006c 82             dc.b 130
159  006d 00             dc.b page(f_NonHandledInterrupt)
160  006e 0000           dc.w f_NonHandledInterrupt
161  0070 82             dc.b 130
163  0071 00             dc.b page(f_NonHandledInterrupt)
164  0072 0000           dc.w f_NonHandledInterrupt
165  0074 82             dc.b 130
167  0075 00             dc.b page(f_NonHandledInterrupt)
168  0076 0000           dc.w f_NonHandledInterrupt
169  0078 82             dc.b 130
171  0079 00             dc.b page(f_NonHandledInterrupt)
172  007a 0000           dc.w f_NonHandledInterrupt
173  007c 82             dc.b 130
175  007d 00             dc.b page(f_NonHandledInterrupt)
176  007e 0000           dc.w f_NonHandledInterrupt
227                      xdef __vectab
228                      xref __stext
229                      xdef f_NonHandledInterrupt
248                      end

这个0X82很可能对应的是dc.b这样一个东西,这个东西暂时还看不懂。

呵呵,我继续测试看看有关__vectab的猜测是否正确,香水先生也帮我看看。。。

截图00.jpg (133.69 KB )

截图00.jpg

截图01.jpg (74 KB )

截图01.jpg

使用特权

评论回复
28
yewuyi|  楼主 | 2009-11-6 15:11 | 只看该作者
经过测试stm8_interrupt_vector.c这个文件名可以随便改,只要手工在项目设置中把两者修改为同一个文件名即可。

使用特权

评论回复
29
yewuyi|  楼主 | 2009-11-6 15:15 | 只看该作者
第二个测试:_vectab[]居然也是可以随便改名字的,怎么改都可以正确编译。


郁闷,这个猜测失败了,不知道问题出在哪?

使用特权

评论回复
30
香水城| | 2009-11-6 15:25 | 只看该作者
说老实话,这个_vectab[]是如何分配的我并不在意,只要能够被分配到正确的地址即可。

不了解_vectab[]的分配方式,不影响正常地使用这款芯片。

使用特权

评论回复
31
yewuyi|  楼主 | 2009-11-6 15:32 | 只看该作者
I SEE ,I SEE。。。

_vectab[]确实是个可以随便命名的东西。

终于彻底的搞清楚它了。。。
1、struct interrupt_vector const _vectab[]={}
2、+seg .const -b 0x8000 -k
原来被定位到0x8000还有const的功劳,去掉const就从0x0000开始了。。。

_vectab[]只是随便定义了数组,这个数组在应用代码中根本不需要用到,所以这个数组名字自然就可以随便起了,不是什么关键字, _vectab的连接定位完全由const决定的,当修改了项目设置中的vector addre出现LKF文件和project的settings中vector addre不一致的时候,优先使用了对话框内的设置。

冥想下找到的答案,估计这个答案应该比较接近真实根源了。

现在还差一个0x82的问题没有弄清楚,dc.b这个东西一时还没查到这个指令的操作码,还没搞清楚它。

使用特权

评论回复
32
yewuyi|  楼主 | 2009-11-6 15:40 | 只看该作者
说老实话,这个_vectab[]是如何分配的我并不在意,只要能够被分配到正确的地址即可。

不了解_vectab[]的分配方式,不影响正常地使用这款芯片。
香水城 发表于 2009-11-6 15:25


从香水你的角度讲,你这么说有一定的道理,但从我的角度讲,如果我要求其它工程师切换到STM8的平台做产品,自然就要给他们进行STM8的培训,所以总是要尽量把所有的问题都弄清楚的,切换一个开发平台和新建一个开发平台是需要很多评估的,如果他们对我的培训质量不满意,我就没办法说服公司建立以STM8为基础的开发平台,那样最多只能是我自己偶尔用它做几个项目,但STM8的资源和价格确实比较吸引我,而且我一直以来对ST的产品仰慕已久,因为我们产品定位的问题,我们用上STM32的可能很小,即使用上,量也很小,所以,全部的指望就在这个STM8上了啊。。。

使用特权

评论回复
33
香水城| | 2009-11-6 15:46 | 只看该作者
哈哈,31楼对_vectab[]的分析正确。

关于这个0x82,请看我在22楼的回答,它就是下面这个结构中的interrupt_instruction分量,从字面上就可知道它是一条指令,而在STM8指令系统的手册中,也说明了这是一条不公开的指令。

struct {
unsigned char interrupt_instruction;
interrupt_handler_t interrupt_handler;
};



PM0044STM8 CPU programming manual 2Jun-2008

使用特权

评论回复
34
yewuyi|  楼主 | 2009-11-6 15:47 | 只看该作者
这个dc.b 130的作用是什么还没看懂,香水先生对这个ASM指令应该比较熟悉了把?!

使用特权

评论回复
35
香水城| | 2009-11-6 15:49 | 只看该作者
从香水你的角度讲,你这么说有一定的道理,但从我的角度讲,如果我要求其它工程师切换到STM8的平台做产品,自然就要给他们进行STM8的培训,所以总是要尽量把所有的问题都弄清楚的,切换一个开发平台和新建一个开发 ...
yewuyi 发表于 2009-11-6 15:40


哈哈,佩服叶师傅刨根问底的精神,如果您需要我可以派人跟你们做个培训。

使用特权

评论回复
36
yewuyi|  楼主 | 2009-11-6 15:54 | 只看该作者
关于培训的事情,我一直在和代理商在联系呢。

呵呵,只要把俺这样‘爱学’的学生教会了,俺的别的工程师自然就都会了。。。

使用特权

评论回复
37
yewuyi|  楼主 | 2009-11-6 15:56 | 只看该作者
不公开的指令,俺彻底晕倒。。。


看来只能等ST公开他了。。。

使用特权

评论回复
38
yewuyi|  楼主 | 2009-11-6 15:59 | 只看该作者
收工,结贴走人。。。

谢谢香水,谢谢其它几位兄弟的回答。。。

使用特权

评论回复
39
香水城| | 2009-11-6 16:04 | 只看该作者
不公开的指令,俺彻底晕倒。。。


看来只能等ST公开他了。。。
yewuyi 发表于 2009-11-6 15:56


其实你可以理解这条不公开的指令为一个特殊的CALL指令,它的作用就是跳转到紧跟着的3个字节指向的地址,同时把相应的寄存器压入堆栈,与IRET指令对应。

CALL与RET成对,而这个0x82指令与IRET成对。

使用特权

评论回复
40
mcuisp| | 2009-11-6 16:26 | 只看该作者
ST干吗不定义一个指令助记符?又不要成本;P

使用特权

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

本版积分规则