Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
外部中断的使用学习
发布于 2018-08-20 18:26:26 浏览:4745
订阅该版
* 本帖最后由 敬坚 于 2018-8-20 18:26 编辑 * 本人新手,因为工作需要用到外部中断,所以学习研究了一下。看到论坛里基本没提到过这个,可能是太简单了:) 将自己学习和分析的过程发出来,希望大家能指出不对的地方给出意见和解答下个人的疑惑,非常感谢! **RTT_外部中断的使用**官方资料的编程指南中说到如下内容,可以知道在Cortex-M系列中,外部中断的处理方式是用户自己定义与中断向量表中名字相同的中断函数来处理。![说明1.png](/uploads/201808/20/165412gnc6fun0fmiacauf.png)![说明2.png](/uploads/201808/20/165459fo0x305x3c5tkxcc.png) **所以尝试自己编写代码。**rt_thread_t exti;rt_sem_t exti_sem = RT_NULL; int rt_application_init(){ rt_thread_tinit_thread; /*创建1个线程 */ init_thread = rt_thread_create("init", rt_init_thread_entry,RT_NULL, 512, 8, 20); if(init_thread!= RT_NULL) rt_thread_startup(init_thread); return 0;} static void rt_init_thread_entry(void*parameter){ rt_thread_tled_thread; /*创建led0线程 */ led_thread= rt_thread_create("led0", led0_thread_entry, RT_NULL, 256, 20, 20); if(led_thread!= RT_NULL) rt_thread_startup(led_thread); /*创建外部中断处理线程 */ exti= rt_thread_create("exti", exti_thread_entry, RT_NULL, 256, 20,20); if(exti != RT_NULL) rt_thread_startup(exti); /*创建信号量 */ exti_sem= rt_sem_create("sem1", 0, RT_IPC_FLAG_FIFO);} /***led0线程入口函数*led闪烁和GPIOC13电平翻转*/static void led0_thread_entry(void*parameter){ rt_hw_led_init(); while(1) { GPIO_SetBit(GPIOC,PIN13); rt_hw_led_on(0); rt_thread_delay(RT_TICK_PER_SECOND/5); GPIO_ClrBit(GPIOC, PIN13); rt_hw_led_off(0); rt_thread_delay(RT_TICK_PER_SECOND/5); }} /*** 外部中断线程入口函数* 外部中断设置:端口GPIOC0 双边沿触发*/void exti_thread_entry(void *parameter){ rt_uint32_tcount; /*外部中断引脚配置 */ GPIO_Init(GPIOC,PIN0, 0, 1, 0, 0); EXTI_Init(GPIOC,PIN0, EXTI_BOTH_EDGE); NVIC_EnableIRQ(GPIOC0_IRQn); EXTI_Open(GPIOC,PIN0); while(1) { rt_sem_take(exti_sem,RT_WAITING_FOREVER); count++; if(!(count%2)) rt_hw_led_on(2); else rt_hw_led_off(2); }} /***GPIOC0是MCU的外部中断引脚之一* 硬件上用杜邦线将C13和C0引脚连接* 通过C13的电平翻转来提供外部中断信号*/void GPIOC0_Handler(void){ rt_interrupt_enter(); EXTI_Clear(GPIOC, PIN0); /*释放一个信号量 */ rt_sem_release(exit_sem); rt_interrupt_leave();}**整体思路:**1. led0线程中会让red led 一直闪烁且翻转GPIOC13的电平2. GPIOC13电平翻转时触发GPIOC0外部中断,中断函数中释放一个信号量3. 中断处理线程会永远等待信号量,当获取到信号量时会点亮或熄灭blueled**现象:**blue led 和 red led 以相同频率闪烁。可以知道,外部中断能触发且是按照中断向量表的名字来定义中断函数,没有API。**思考:**对于外部中断的编程,以上方式是否正确?![图2.jpg](/uploads/201808/20/165553v6ev3v3y43pl7z3b.jpg)![图1.jpg](/uploads/201808/20/165554tjctjes2t72ela3d.jpg) ![554,415](file:///C:/Users/10429/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg) ![554,343](file:///C:/Users/10429/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg) **优先级试验**通过上面的图片可以看出在相同优先级的情况下,led0线程会继续执行,挂起后再去执行中断线程,这问题我们也可以通过自己对优先级的理解去得出相同的结果。那提高中断线程的优先级理应会先执行中断线程再去执行led0线程。修改代码:static void rt_init_thread_entry(void*parameter){ rt_thread_tled_thread; /*创建led0线程 */ led_thread= rt_thread_create("led0", led0_thread_entry, RT_NULL, 256, **25**, 20); if(led_thread!= RT_NULL) rt_thread_startup(led_thread); /*创建外部中断处理线程 */ exti= rt_thread_create("exti", exti_thread_entry, RT_NULL, 256, 20,20); if(exti != RT_NULL) rt_thread_startup(exti); /*创建信号量 */ exti_sem= rt_sem_create("sem1", 0, RT_IPC_FLAG_FIFO);}查看波形:![图3.jpg](/uploads/201808/20/165643pqqowo8w8y28uqfl.jpg) ![553,342](file:///C:/Users/10429/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg) 可以看出确实是先执行的中断线程再执行led0线程。**思考:**通过上面个人的分析验证可以知道,针对Cortex-M系列的外部中断编程方式。但有些人可能需要将处理放在中断函数中,而不会放在线程执行。 **修改代码:**屏蔽掉中断线程的blue led处理和信号量的创建,在中断函数中直接点亮或熄灭blue led,led0线程保存不变,优先级为25。 **voidGPIOC0_Handler(void)****{**** rt_interrupt_enter();** ** EXTI_Clear(GPIOC, PIN0);**** count++;**** if(!(time1_count%2))**** rt_hw_led_on(2);**** else**** rt_hw_led_off(2);** ** rt_interrupt_leave();****}**查看波形:![图4.jpg](/uploads/201808/20/165724ydm3nffdbbknedu3.jpg) ![553,353](file:///C:/Users/10429/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg) 可以看到在中断函数中熄灭blue led后返回led0线程再熄灭red led。在这里是先响应了外部中断,那能不能执行完led0再去响应外部中断呢?![C0中断优先级.png](/uploads/201808/20/165922p5tseg5mbsnag6nh.png) ![297,130](file:///C:/Users/10429/AppData/Local/Temp/msohtmlclip1/01/clip_image013.png) GPIOC0中断在向量表中的优先级**修改代码:**上次的测试中,led0线程的优先级是25,在这里修改为20。**查看波形:**![图5.jpg](/uploads/201808/20/170228dyffr0cyisfb0eru.jpg)![设断点验证1.png](/uploads/201808/20/170229m2n2oo3kde8dapwz.png)![设断点验证2.png](/uploads/201808/20/170229g5zvv2y5wqvrwwoq.png) ![553,374](file:///C:/Users/10429/AppData/Local/Temp/msohtmlclip1/01/clip_image015.jpg) ![554,298](file:///C:/Users/10429/AppData/Local/Temp/msohtmlclip1/01/clip_image017.png) ![436,143](file:///C:/Users/10429/AppData/Local/Temp/msohtmlclip1/01/clip_image018.png) 通过波形和设断点的方法是发现提高led0线程优先级无法达到先执行完led0线程再响应外部中断的目的。在这里我就有疑问了,假设我的处理是放在中断函数里,而我又想让当前的线程先执行完再去响应外部中断。**这种情况应该怎么去设置,或者说能这样做吗?****总结一下:**1. 对于Cortex-M系列,通过中断向量表的名称来定义自己的中断函数。2. 若中断处理放在线程中执行,可修改线程的优先级来改变中断的响应先后顺序。 **疑问:**1. 以上对于外部中断的编程方法或者思路是否正确2. 若处理放在中断函数里执行,怎样修改中断的优先级
查看更多
3
个回答
默认排序
按发布时间排序
yqiu
2018-08-20
这家伙很懒,什么也没写!
外部中断一定是会抢占线程的,中断函数中一般是处理最紧急的事情,剩下的事情交给线程去处理。
youhuanghuang
2018-08-20
这家伙很懒,什么也没写!
学习ing
youhuanghuang
2018-08-20
这家伙很懒,什么也没写!
请问有没有SD卡存储的例程啊,能发给我参考一下吗
撰写答案
登录
注册新账号
关注者
0
被浏览
4.7k
关于作者
敬坚
这家伙很懒,什么也没写!
提问
11
回答
14
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
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组件
最新文章
1
在用clangd开发RTT吗,快来试试如何简单获得清晰干净的工作区
2
GD32F450 片内 flash驱动适配
3
STM32H7R7运行CherryUSB
4
RT-Smart首次线下培训,锁定2024 RT-Thread开发者大会!
5
使用RC522软件包驱动FM1722
热门标签
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
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
6
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部