打印

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

[复制链接]
楼主: yewuyi
手机看帖
扫描二维码
随时随地手机跟帖
61
东海龙子| | 2013-9-21 23:23 | 只看该作者 回帖奖励 |倒序浏览
        {0x82, NonHandledInterrupt}, /* irq18 */
        {0x82, I2C_ISR}, /* irq19 */
        {0x82, NonHandledInterrupt}, /* irq20 */
我这么改为什么会提示错啊?
#error cpstm8 stm8_interrupt_vector.c:44(8+7) invalid pointer initializer
使用到的中断不是要改名的吗?我改了什么会出错

使用特权

评论回复
62
qjyjbb| | 2013-9-24 10:10 | 只看该作者
东海龙子 发表于 2013-9-21 23:23
{0x82, NonHandledInterrupt}, /* irq18 */
        {0x82, I2C_ISR}, /* irq19 */
        {0x82, NonHandledInterrupt} ...

I2C_ISR函数类型不对,申明为@far @interrupt void I2C_ISR(void),或用(interrupt_handler_t)强制转换。

使用特权

评论回复
63
东海龙子| | 2013-9-24 19:37 | 只看该作者
qjyjbb 发表于 2013-9-24 10:10
I2C_ISR函数类型不对,申明为@far @interrupt void I2C_ISR(void),或用(interrupt_handler_t)强制转换。 ...

我在main.c里面就是@far @interrupt void I2C_ISR(void){}。也在interrupt_vector.c试了你说的还是错啊。还是哪里我弄错了?

使用特权

评论回复
64
askhua520| | 2013-10-30 21:02 | 只看该作者
本帖最后由 askhua520 于 2013-10-30 21:04 编辑

整理一下,不知理解对不对;
/*        BASIC INTERRUPT VECTOR TABLE FOR STM8 devices
*        Copyright (c) 2007 STMicroelectronics
*/
//typedef void (*)void,;定义一个类型(指向函数的指针)取得void类型函数的函数入口地址指针
typedef void @far (*interrupt_handler_t)(void);
//定义一个结构体类型存放{中断指令,中断处理程序名(即中断函数入口指针)}
struct interrupt_vector {
        unsigned char interrupt_instruction;
        interrupt_handler_t interrupt_handler;
};
//定义一个空中断函数,执行后直接返回主函数
@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;
}
//声明启动初始化程序,_stext()程序在别处定义
extern void _stext();     /* startup routine */
//定义一个二维数组成对存放中断指令和中断函数入口地址指针,
//MCU根据第二下标值[2,32]执行0x82指令"跳转"相应的中断程序入口地址
//数组存放位置在const关键值标定的起始地址0x8000,即_vectab代表起始地址0x8000
//1、struct interrupt_vector const _vectab[]={}
//2、+seg .const -b 0x8000 -k
//CALL与RET成对,而这个0x82指令与IRET成对
struct interrupt_vector const _vectab[] = {
        //将_stext强制转化为interrupt_handler_t类型
        {0x82, (interrupt_handler_t)_stext}, /* reset */
        {0x82, NonHandledInterrupt}, /* trap  */
        {0x82, NonHandledInterrupt}, /* irq0  */
        {0x82, NonHandledInterrupt}, /* irq1  */
        {0x82, NonHandledInterrupt}, /* irq2  */
        {0x82, NonHandledInterrupt}, /* irq3  */
        {0x82, NonHandledInterrupt}, /* irq4  */
        {0x82, NonHandledInterrupt}, /* irq5  */
        {0x82, NonHandledInterrupt}, /* irq6  */
        {0x82, NonHandledInterrupt}, /* irq7  */
        {0x82, NonHandledInterrupt}, /* irq8  */
        {0x82, NonHandledInterrupt}, /* irq9  */
        {0x82, NonHandledInterrupt}, /* irq10 */
        {0x82, NonHandledInterrupt}, /* irq11 */
        {0x82, NonHandledInterrupt}, /* irq12 */
        {0x82, NonHandledInterrupt}, /* irq13 */
        {0x82, NonHandledInterrupt}, /* irq14 */
        {0x82, NonHandledInterrupt}, /* irq15 */
        {0x82, NonHandledInterrupt}, /* irq16 */
        {0x82, NonHandledInterrupt}, /* irq17 */
        {0x82, NonHandledInterrupt}, /* irq18 */
        {0x82, NonHandledInterrupt}, /* irq19 */
        {0x82, NonHandledInterrupt}, /* irq20 */
        {0x82, NonHandledInterrupt}, /* irq21 */
        {0x82, NonHandledInterrupt}, /* irq22 */
        {0x82, NonHandledInterrupt}, /* irq23 */
        {0x82, NonHandledInterrupt}, /* irq24 */
        {0x82, NonHandledInterrupt}, /* irq25 */
        {0x82, NonHandledInterrupt}, /* irq26 */
        {0x82, NonHandledInterrupt}, /* irq27 */
        {0x82, NonHandledInterrupt}, /* irq28 */
        {0x82, NonHandledInterrupt}, /* irq29 */
};
  

使用特权

评论回复
65
GERALDWONG| | 2013-12-10 11:42 | 只看该作者
香水城 发表于 2009-11-4 12:18
现在让我们逐一看看4楼的问题:

1)typedef是C的标准关键字,用于定义新的数据类型,比如常见的:

goooooooooooooood

使用特权

评论回复
66
KuMo_2011| | 2014-2-20 12:21 | 只看该作者
标记

使用特权

评论回复
67
emcaaa| | 2014-5-5 15:55 | 只看该作者
觉得很好,不仅在stm8方面有所收获,还特别佩服楼主和几位跟帖刨根问底的精神

使用特权

评论回复
68
放牛的春天| | 2014-8-21 16:35 | 只看该作者
佩服刨根问底的精神,楼主反应很快

使用特权

评论回复
69
huangke1993| | 2014-9-20 15:04 | 只看该作者
yewuyi 发表于 2009-11-3 16:46
感觉很失败,完全看不懂stm8_interrupt_vector.c这个文件是怎么‘潜伏工作’的。
第一个看不懂:typedef vo ...

1.第一个是将interrupt_handle_t重定义为void @farxx(void)类型的指向函数的指针
2其实他是定义了一个结构体,第一个是定义一个字符变量,即是中断向量表中的0x82,因为STM8S的中断向量是四个字节的,至于这个0x82是干嘛的,我也不清楚。第二个很显然就是指向中断服务肉蔻地址的指针了。
3.他是系统自带的一个中断函数,你可以看到,如果你没有使用任何中断,中断向量表中的中断服务的入口地址都是这个函数。我觉得是为了避免意外中断什么的。
4那是cosmic环境下创建工程后给出的复位程序,你可以用反汇编窗口查看他的内容。他的地址是编译器自动赋值的。
5 0x82我也不是很清楚。(interrupt_handler_t)_stext就是将_stext地址强制转换为interrupt_handler_t类型。
6STM8S当发生中断时,硬件会自动从相应的地址取出中断服务入口地址去执行。如复位的话,就是从0x8000开始,取出四个字节去执行。0x82我觉得是中断向量的标志,以此来告诉CPU这是中断向量

使用特权

评论回复
70
zhongchuangjie| | 2014-10-29 14:50 | 只看该作者
mark下

使用特权

评论回复
71
ZJU_ding| | 2015-1-22 12:26 | 只看该作者
这些问题确实都是不理解的问题啊,这个帖子真好,看下来学了不少

使用特权

评论回复
72
hsyyqq| | 2015-1-28 16:35 | 只看该作者

使用特权

评论回复
73
nooodle| | 2015-4-16 16:20 | 只看该作者

使用特权

评论回复
74
yun_xiao| | 2015-9-11 09:16 | 只看该作者
我也碰到了类似的问题

使用特权

评论回复
75
qq543538634| | 2016-9-2 10:12 | 只看该作者
七年前的回答,不知道当年跟我一样懵懂的入门学徒是否已经成长为一代宗工

使用特权

评论回复
76
wenqing89| | 2016-11-28 18:05 | 只看该作者
楼主这深究的精神值得敬佩,现在就缺少了,都太浮躁了

使用特权

评论回复
77
sjh2100| | 2017-6-21 09:28 | 只看该作者
现在叫工匠精神!顶帖

使用特权

评论回复
78
kingkits| | 2017-6-21 10:17 | 只看该作者
0x82应该是机器码,用于长跳转。相当于C语言中的goto
中断向量表应该是一系列跳转

使用特权

评论回复
79
kingkits| | 2017-6-21 10:19 | 只看该作者
NonHandledInterrupt 是个中断格式的函数,就在你的图中标记的1

使用特权

评论回复
80
impig33| | 2017-12-10 22:49 | 只看该作者
先马后看

使用特权

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

本版积分规则