eBox(stm32) 之中断结构
eBox的中断结构参考了mbed,和我们平时所用的中断结构有些差异,不容易理解,最近仔细看了底层代码,终于搞清楚了,总结一下
// 绑定静态回调函数
void attach(void(*fptr)(void)){
pirq.attach(fptr);
}
FunctionPointer pirq;
typedefvoid(*exti_irq_handler)(uint32_t id);
static exti_irq_handler irq_handler;
staticuint32_t exti_irq_ids[16];
int exti_irq_init(uint8_t index,exti_irq_handler handler,uint32_t id)
{
exti_irq_ids[index]= id;
irq_handler = handler;
return0;
}
void IRQ::irq_handler(uint32_t id)
{
IRQ *handler =(IRQ*)id;// 指向回调函数地址
handler->pirq.call();// 调用回调函数
}
exti_irq_init(13,(&IRQ::irq_handler),(uint32_t)this);
void EXTI4_15_IRQHandler(void)
{
if(LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_13)!= RESET)
{
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_13);
/* Manage code in main.c.*/
irq_handler(exti_irq_ids[13]);
}
}
/** A class for storing and calling a pointer to a static or member function 用来保存静态或成员函数的指针类
*/
// R-返回值类型 A1-参数类型
template<typename R,typename A1>
classFunctionPointerArg1{
public:
/** Create a FunctionPointer, attaching a static function 创建函数指针
*
* @param function The static function to attach (default is none) 附加静态函数,默认为void
*/
FunctionPointerArg1(R (*function)(A1)=0){
attach(function);
}
/** Create a FunctionPointer, attaching a member function
* 附加成员函数,object 成员函数的对象的指针。 成员函数
* @param object The object pointer to invoke the member function on (i.e. the this pointer)
* @param function The address of the member function to attach
*/
template<typename T>
FunctionPointerArg1(T *object, R (T::*member)(A1)){
attach(object, member);
}
/** Attach a static function
* 附件静态函数
* @param function The static function to attach (default is none)
*/
void attach(R (*function)(A1)){
_p.function = function;
_membercaller =0;
}
/** Attach a member function
* 附件成员函数
* @param object The object pointer to invoke the member function on (i.e. the this pointer)
* @param function The address of the member function to attach
*/
template<typename T>
void attach(T *object, R (T::*member)(A1)){
_p.object =static_cast<void*>(object);// 将对象转换成void* 类型
*reinterpret_cast<R (T::**)(A1)>(_member)= member;
_membercaller =&FunctionPointerArg1::membercaller<T>;//注册成员函数地址
}
/** Call the attached static or member function
*/
R call(A1 a){
if(_membercaller ==0&& _p.function){
return _p.function(a);
}elseif(_membercaller && _p.object){
return _membercaller(_p.object, _member, a);
}
return(R)0;
}
/** Get registered static function
*/
R(*get_function(A1))(){
return _membercaller ?(R(*)(A1))0:(R(*)(A1))_p.function;
}
#ifdef MBED_OPERATORS
R operator()(A1 a){
return call(a);
}
operatorbool(void)const{
return(_membercaller != NULL ? _p.object :(void*)_p.function)!= NULL;
}
#endif
private:
template<typename T>//对象类型
// 调用成员 对象,成员函数
static R membercaller(void*object,uintptr_t*member, A1 a){
T* o =static_cast<T*>(object);//类型转换
R (T::**m)(A1)=reinterpret_cast<R (T::**)(A1)>(member);
return(o->**m)(a);
}
union{
R (*function)(A1);// static function pointer 静态函数指针
void*object;// object this pointer 对象指针
} _p;// 用联合体保存指针,静态函数或者对象,只能保存其中一种
uintptr_t _member[4];// aligned raw member function pointer storage - converted back by registered _membercaller
// 函数指针
R (*_membercaller)(void*,uintptr_t*, A1);// registered membercaller function to convert back and call _m.member on _object
};
eBox(stm32) 之中断结构的更多相关文章
- (二)stm32之中断配置
一.stm32的中断和异常 Cortex拥有强大的异常响应系统,它能够打断当前代码执行流程事件分为异常和中断,它们用一个表管理起来,编号为0~15为内核异常,16以上的为外部中断,这个表就是中断向量表 ...
- STM32外部中断具体解释
一.基本概念 ARM Coetex-M3内核共支持256个中断,当中16个内部中断,240个外部中断和可编程的256级中断优先级的设置.STM32眼下支持的中断共84个(16个内部+68个外部), ...
- stm32之中断配置
一.stm32的中断和异常 Cortex拥有强大的异常响应系统,它能够打断当前代码执行流程事件分为异常和中断,它们用一个表管理起来,编号为0~15为内核异常,16以上的为外部中断,这个表就是中断向量表 ...
- STM32的中断系统
STM32的中断系统 STM32具有十分强大的中断系统,将中断分为了两个类型:内核异常和外部中断.并将所有中断通过一个表编排起来,下面是stm32中断向量表的部分内容: 上图-3到6这个区域被标黑了, ...
- 转载:STM32之中断与事件---中断与事件的区别
这张图是一条外部中断线或外部事件线的示意图,图中信号线上划有一条斜线,旁边标志19字样的注释,表示这样的线路共有19套.图中的蓝色虚线箭头,标出了外部中断信号的传输路径,首先外部信号从编号1的芯片管脚 ...
- STM32之中断与事件---中断与事件的区别
STM32之中断与事件---中断与事件的区别 http://blog.csdn.net/flydream0/article/details/8208463 这张图是一条外部中断线或外部事件线的示意图 ...
- STM32外部中断初理解
PA0,PB0...PG0--->EXTI0 PA1,PB1...PG1--->EXTI1 ....... PA15,PB15...PG15--->EXTI15 以上为GPIO和中断 ...
- STM32之中断
在STM32(Cortex-M3)中没有显示的代码拷贝,只有启动代码进行了向量的初始化,一直以为是编译器在程序影像中自己完成了相关向量的拷贝,即,拷贝到固定的NVIC区,事实上并不是这样,cortex ...
- STM32串口中断实例二
int main(void) { uint8_t a=;//LED高低电压控制 /* System Clocks Configuration */ RCC_Configuration(); //系统时 ...
随机推荐
- SQL模仿Split 功能
--方法0:动态SQL法 declare @s varchar(100),@sql varchar(1000) set @s='1,2,3,4,5,6,7,8,9,10' set @sql='sele ...
- Java并发编程底层实现原理 - volatile
Java语言规范第三版中对volatile的定义如下: Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致性的更新,线程应该确保通过排他锁 单独获得这个变量. volatile有时候 ...
- 【emWin】例程二:显示“hello,world”
实验指导书及代码包下载: http://pan.baidu.com/s/1c1Csx48
- Git 恢复某个文件指定版本
1. git reflog 找到comit id 2. git reset edf92f a.txt 3. git commit -m "ssss" 4. git checkou ...
- 手动编译安装LNMP
yum -y install gcc gcc-c++ autoconf nss_ldap libjpeg libjpeg-devel libpng libpng-devel freetype free ...
- gcc编译命令行依赖库的指定顺序
gcc链接过程中定义了三个集合:可重定位目标文件集合E.未解析符号集合U和已定义符号集合D,链接基本流程如下: 1) 按命令行指定顺序依次处理每个目标文件和库文件: 2) 如果为目标文件,将其加入集合 ...
- protected $appends in Laravel
protected $appends = ['icon']; public function getIconAttribute(){ return Gravatar::src($this->em ...
- java基础总结——基础语法1
一.标示符 二.关键字 三.java基本数据类型 3.1 常量 ● 常量表示不能改变的数值. ● java中常量的分类: 1. 整数常量.所有整数 2. 小数常量.所有小时 3. 布尔型常量.较为特有 ...
- Scala的模式匹配
1.概述 2.程序示例(普通的示例) 3.模式匹配(Array) 4.程序示例(Array) 5.模式匹配(List) 6.程序示例 7.遍历 8.模式匹配(case class) 9.程序示例(传统 ...
- 笔记 .Net反射机制
.Net中反射机制, 一般常用的就是这两句: Type type=Assembly.Load("RoadFlow.Data."+dataType).GetType(typeName ...