Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
MicroPython
RT-Thread中中断触发MicroPython函数
发布于 2020-10-10 17:27:46 浏览:1063
订阅该版
昨天完成了C函数与Python的绑定,可以实现通过Python调用C的函数,具体文章可参考: https://club.rt-thread.org/ask/article/308.html 接下来的任务是实现在C语言中调用Python函数。 我的想法是,通过将一个Python函数注册到侦听器,当有按键中断触发的时候,调用这个Python函数。 也就是说,这些函数不是事先写死到代码中的,而是通过动态注册的方式实现。 ![6938fe2673d7390f9e5f62c01e1676ca.png](/uploads/20201010/6938fe2673d7390f9e5f62c01e1676ca.png) 这里面要用到的一个特殊的方法是mp_sched_schedule,提供个C调用Python的方法,但是此方法目前好像只能传一个参数过去,还没来得及传入多个参数用那个方法。 废话不多说,开始写码! 第一步,在昨天代码的基础上,对children_obj_t扩展出一个lollipop_arrive的方法,并定义一个active_children作为最后的活动类,让C知道应该触发谁的事件,同时对mars_children_make_new方法进行简单修改,加入一行active_children=self;代码如下: ``` typedef struct _children_obj_t { mp_obj_base_t base; // 定义的对象结构体要包含该成员 char* name; // 成员函数 uint8_t age; uint8_t sex; **mp_obj_t lollipop_arrive; //当棒棒糖到达的时候的回调函数** }children_obj_t; **children_obj_t* active_children;** STATIC mp_obj_t mars_children_make_new(const mp_obj_type_t *type, size_t n_args , size_t n_kw,const mp_obj_t *args) { mp_arg_check_num(n_args ,n_kw,1,3,true); // 检查参数个数,最少1个参数,最多3个参数 children_obj_t *self = m_new_obj(children_obj_t); // 创建对象,分配空间 self->base.type = &mars_children_type; // 定义对象类型 if(n_args >=1 ) { self->name = mp_obj_str_get_str(args[0]); } if(n_args >=2 ) { self->age = mp_obj_get_int(args[1]); } if(n_args ==3 ) { self->sex = mp_obj_get_int(args[2]); } printf("Create a new children , name:%s , age:%d , sex:%s\n" ,self->name,self->age,self->sex==0?"girl":"boy"); **active_children=self; //将最后一个定义的对象设置为活动对象** return MP_OBJ_FROM_PTR(self); //返回对象 } ``` 只有加粗的部分是修改的,其他和昨天的一样一样的。 第二步,写中断触发函数和侦听器注册函数,以及定义字典,最后别忘了QDEF(MP_QSTR_set_fun, (const byte*)"\x85\x07" "set_fun") ``` //中断服务函数 void Key_Handler(void* args) { rt_interrupt_enter(); //通知操作系统此时进入中断状态 int16_t key; memcpy(&key, (void *)&args, sizeof(int16_t)); mp_sched_schedule(active_children->lollipop_arrive, MP_OBJ_FROM_PTR(mp_obj_new_int(key))); rt_kprintf("KeyOn %d!\n",key); //调用Python rt_interrupt_leave(); //通知操作系统此时离开中断状态 } //侦听器设置函数 STATIC mp_obj_t mars_children_set_fun(mp_obj_t self_in , mp_obj_t fun) { children_obj_t *self = MP_OBJ_TO_PTR(self_in); self->lollipop_arrive = fun; return mp_const_none; } STATIC MP_DEFINE_CONST_FUN_OBJ_2(mars_children_set_fun_obj,mars_children_set_fun); STATIC const mp_rom_map_elem_t children_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_sayhello),MP_ROM_PTR(&mars_children_sayhello_obj) }, **{ MP_ROM_QSTR(MP_QSTR_set_fun),MP_ROM_PTR(&mars_children_set_fun_obj) },** }; ``` 在上一段代码中,主要是mp_sched_schedule函数的使用,函数有两个参数,第一个是调用的方法,第二个是传入的一个参数,目前只研究出了单参的传递,多参的回头试试用数组能否解决,下面一行的打印是用来做测试的,不会在Python中输出。这里需要提醒一下大家,这种调用尽量还是用线程间通讯的方式去做,尽可能的不要在中断中处理任何事务,所以我们这种方法,仅作为例子参考。 第三步,安装中断,这个在main函数中写就行了 ``` // 安装中断 rt_pin_mode(KEY_1,PIN_MODE_INPUT_PULLDOWN); //上拉输入 rt_pin_attach_irq(KEY_1,PIN_IRQ_MODE_RISING,Key_Handler,(void*)1); //上升沿导通 rt_pin_irq_enable(KEY_1,PIN_IRQ_ENABLE); //使能中断 rt_pin_mode(KEY_2,PIN_MODE_INPUT_PULLDOWN); //上拉输入 rt_pin_attach_irq(KEY_2,PIN_IRQ_MODE_RISING,Key_Handler,(void*)2); //上升沿导通 rt_pin_irq_enable(KEY_2,PIN_IRQ_ENABLE); //使能中断 ``` 这里注册了两个按键,分别是PA0和PC13(这个根据你板子而定) 好了,整体代码就完成了,烧入板子,我们开始写python部分。 这里需要提醒一下,最好在进入Python之前测试一下你的中断是否被触发了。第一次写的时候发现引脚搞错了,死活没有中断,我以为是Python写的有问题呢,最后测试是GPIO的问题……单元测试还是很有必要的。 开机启动后进入Python,我是在main中用mpy_main进入的,如果用文件方式启动,执行完就退出了,无法测试中断。 Python代码中,主要流程是定义一个children实例,然后给这个实例注入一个触发函数,最后,通过实体按键实现函数的触发。 ``` import mars e = mars.children("Claire",8,0) def lollipop(num): print("Thank you for the lollipop:%d"%(num)) e.set_fun(lollipop) ``` 这段代码通过串口调试助手发送。定义方法后不要手动输入空格,直接输入内容就行了,然后下面的三个空行是跳出方法定义继续执行下面的,这个函数只有一个参数,多了会报错。 set_fun把这个函数注入到侦听器中,然后就可以出发中断了。 ``` >>> import mars >>> e = mars.children("Claire",8,0) Create a new children , name:Claire , age:8 , sex:girl >>> def lollipop(num): ... print("Thank you for the lollipop:%d"%(num)) ... ... ... >>> e.set_fun(lollipop) >>> Thank you for the lollipop:1 Thank you for the lollipop:2 ```
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
Mars.CN
这家伙很懒,什么也没写!
文章
2
回答
23
被采纳
0
关注TA
发私信
相关文章
1
请问rt-thread有没有移植micropython呢
2
micropython import 文件名的方式执行脚本问题
3
第一篇:Micropython 的起源和发展
4
第二篇:RT-Thread Micropython 简介
5
第三篇:RT-Thread Micropython 快速入门
6
第四篇:Micropython DIY 项目汇总
7
第五篇:Micropython 教程和资源
8
第六篇: RT-Thread MicroPython 学习经验和学习路线
9
RT-Thread MicroPython 最新开发板固件汇总【已失效】
10
有Mpy专门的板块啦~
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
RTT_逍遥
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部