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_OPERATORSR operator()(A1 a){return call(a);}operatorbool(void)const{return(_membercaller != NULL ? _p.object :(void*)_p.function)!= NULL;}#endifprivate: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(); //系统时 ...
随机推荐
- .net core 基本概念
asp.net core 是基于 .net core的,所以能够跨平台. 目前存在.NET Framework (CLR), .NET Core (CoreCLR) or Mono,可根据项目的具体情 ...
- ZeroMQ接口函数之 :zmq_proxy – 开始ZMQ内置代理
ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq-proxy zmq_proxy(3) ØMQ Manual - ØMQ/4.1.0 Nam ...
- 对拍老是忘记的看这里:bat代码
需要写三个程序,makedata.exe 产生测试数据, program1.exe 是你要检测的程序,program2.exe 往往是一个正确但效率不高(暴力的居多)的程序. 代码很简单,稍作解释:l ...
- Unity字节序问题
问题 Unity中有些配置信息并不想在发布之后给其他人看到,所以在打包的时候进行了简单的编码处理,然后保存为.bytes类型,读取的时候再进行解码处理.今天遇到的很奇葩的问题是: 如果bytes文件U ...
- linux的sysctl基本配置
# Controls the use of TCP syncookiesnet.ipv4.tcp_syncookies = 1 # me write paramnet.ipv4.tcp_timesta ...
- 取到 tableview 自定义section header 上的button
在自定义的组头上,添加了一个button,在点击cell是想取到相应的组头上的button来进行操作时(比如说隐藏.是否响应点击事件等)时,我遇到了取不到所有button的问题,试过了常规的通过vie ...
- 使用二级域名访问本地localhost网站
将C:\Windows\System32\drivers\etc\hosts文件,修改如下.保存该文件时会提示没有权限,解决的方法是用管理员权限打开记事本. # localhost name reso ...
- JSON语法五大要素图文介绍
原文:http://www.jb51.net/article/32398.htm JSON语法是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成,下面就进行学习研究,希望本文能教会 ...
- varnish 隐藏版本号
varnish 隐藏方法: 修改default.vcl配置文件. 找到或添加 vcl_deliver 子程序,代码如下: 1 2 3 4 5 sub vcl_deliver { unse ...
- 用python实现计算1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))类似的公式计算
作业需求: 开发一个简单的python计算器 1.实现加减乘除及拓号优先级解析 2.用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 ...