浅析MicroPython系统底层回调机制

嵌入式开发中,多数外设接口的事件通知都是通过回调函数实现的,这体现在Timer,UART,GPIO等外设。部分模块的状态通知也是通过回调实现的,比如网络状态。

常规的基于C语音的开发,ISR(中断回调函数)工作在系统进程/线程的上下文,回调通知机制容易控制。但是在MicroPython中,python应用工作在虚拟机进程的上下文,中断回调函数发生在C底层进程的上下文,C进程同python虚拟机进程是相互隔离的,所以直接的调用是不通的。
 



MicroPython提供了两种方式实现C底层进程到Python虚拟机进程的通信,实现了底层回调函数到Python应用层的通知。

接下来我们以Timer模块为例,详细分析两种回调机制的原理,以便大家扩展自己的模块到MicroPython系统中,共同丰富发展python轻应用生态。

 

1、创建ISR线程虚拟化环境


创建并初始化ISR线程虚拟化环境,以便ISR线程能获得跟Python虚拟机进程相同的上下文。
 

//1 获取并保存当前虚拟机线程状态
void *old_state = mp_thread_get_state();



//2 分配并设置ISR线程的状态信息,后续初始化均作用在该线程状态上
mp_state_thread_t ts;
mp_thread_set_state(&ts);


//3 初始化ISR新虚拟机线程的堆栈指针, +1表示在跟指针扫描中需要包含ts信息
mp_stack_set_top(&ts + 1);


//4 根据ISR线程的堆栈大小设置新线程虚拟机堆栈大小,堆栈大小依赖于ISR线程堆栈,在不同的模块中该值会
//  有所变化。(痛点1)
mp_stack_set_limit(1024);


//5 传递当前虚拟机线程本地和全局状态信息到新创建线程中
mp_locals_set(mp_local
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值