搜索
查看: 918|回复: 2

[原创] 一个ISR宏,代替startup_xxx.s和xxx_it.c文件

[复制链接]

该用户从未签到

7

主题

18

帖子

9

蝴蝶豆

高级会员

最后登录
2022-12-20
发表于 2018-6-1 15:34:41 | 显示全部楼层 |阅读模式
本帖最后由 yangc9 于 2018-6-1 16:01 编辑

定义:
#define ISR(irqn) void ISR_##irqn();\
__root void(* const pISR_##irqn)() @ 0x8000000 + (irqn+16) * 4 = ISR_##irqn;\
void ISR_##irqn()

使用:
ISR(TIM2_IRQn)
{
//处理你的中断
}

在IAR环境有效.别的环境不知道.

##表示名字拼接.

ISR(TIM2_IRQn)展开成:
void ISR_TIM2_IRQn();
__root void(* const pISR_TIM2_IRQn)() @ 0x8000000 + (TIM2_IRQn+16) * 4 = ISR_TIM2_IRQn;
void ISR_TIM2_IRQn()

第一行声明了一个函数,名为ISR_TIM2_IRQn.
第二行定义一个函数指针,放在0x8000000 + (TIM2_IRQn+16) * 4这个位置, 指向ISR_TIM2_IRQn.这正是中断向量表的位置.
__root令连接器不可删除此变量,即使发现他没有被别的函数使用.
const令编译器将初值直接放在目标位置,而不是在程序开始时赋值.
第3行与后面的大括号构成函数定义.
回复

使用道具 举报

该用户从未签到

0

主题

27

帖子

8

蝴蝶豆

金牌会员

最后登录
2021-9-13
发表于 2018-6-1 15:42:24 | 显示全部楼层
楼主 能不能将原理说一下 不是很明白 谢谢
回复 支持 反对

使用道具 举报

该用户从未签到

20

主题

1628

帖子

5

蝴蝶豆

论坛元老

最后登录
2022-6-7
发表于 2018-6-14 10:33:57 | 显示全部楼层
mcu里面的数据就存放在那里,只是访问的方式不一样,汇编文件和_it.c文件帮我们完成了从地址到函数的转换,方便了我们操作和阅读,隐藏了我们不必要知道的底层信息。
楼主这个操作算很“骚”了,哈哈哈,对于理解了底层的攻城狮来说还是很容易明白的,但是对于初学者或者不熟悉底层的人来说就有点看不懂了。给楼主大胆尝试新方式操作mcu点个大赞
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-5-4 15:35 , Processed in 1.156770 second(s), 32 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表