中断处理是一个比较有意思的东西。uTenux的中断处理包括了处理外部中断、CPU异常等。他是OS中任务无关部分。因此,当中断到来的时候OS会停止任务调度,不会发生任务切换。直到程序从中断中返回。

uTenux的中断处理部分API如下:

1、定义中断处理程序

ER ercd= tk_def_int(UINT dintno,T_DINT* pk_dint);

这个函数定义一个中断定义编号为dtintno的中断处理程序,并允许中断处理程序运行。

中断定义编号是0-255的,比如Cortex-M3中NMI就是2,UASRT1中断就是44,USART2中断就是45、USART3中断就是46.这些可以查ST的Datasheet得到。uTenux中,没有强制将中断处理程序定义成指定的函数,用户可以手动添加。对于外设来说,ST的宏定义是0-240的,使用tk_def_int时需要加上16。

pk_dint是中断处理程序的定义,其定义结构体如下:

typedef struct t_dint {

ATR intatr; /* 处理程序属性 */

FP inthdr; /* 中断处理函数入口地址 */

} T_DINT;

2、从中断处理程序中返回

void tk_ret_int();

当处理程序正在运行时,由中断处理程序所调用的系统调用并不会产生分派;相反,分派将会被延迟到调用tk_ret_int来终止中断处理程序的处理以后(分派延迟)。因此,tk_ret_int会导致对所有在中断处理程序运行期间所发布的分派请求进行处理。

【实验描述】

本次实验在市里工程的基础上完成。打开了串口3的接收中断,并使用OS的功能来完成中断的接收和处理。

1、我重写了usart3的初始化函数,使用了我熟悉的库函数操作。

2、设置NVIC,初始化串口3的中断

3、使用tk_def_int定义中断处理函数。

4、在中断处理函数中通过串口向主机消息,表明已经进入了中断。

【实验代码和输出】

1、串口3初始化代码:

void uart3_init(void)
{USART_InitTypeDef USART_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1ENR_USART3EN,ENABLE);RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC,&GPIO_InitStructure);GPIO_PinAFConfig(GPIOC,GPIO_PinSource10,GPIO_AF_USART3);GPIO_PinAFConfig(GPIOC,GPIO_PinSource11,GPIO_AF_USART3);USART_InitStructure.USART_BaudRate = 115200;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_Init(USART3,&USART_InitStructure);USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);USART_Cmd(USART3,ENABLE);return;
}

2、NVIC设置代码:

void NVIC_Config(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //设置中断优先级分组//使能USART3中断NVIC_IniteStructure.NVIC_IRQChannel = USART3_IRQn;NVIC_IniteStructure.NVIC_IRQChannelPreemptionPriority = 0x01;NVIC_IniteStructure.NVIC_IRQChannelSubPriority = 0x02;NVIC_IniteStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_IniteStructure);
}

3、中断处理代码

#include "IntSample.h"void Usart3Handler(UINT dintno);EXPORT ER IntSample( void )
{UINT i;ER ercd;UINT intsts;T_DINT dint;DI(intsts);//屏蔽所有中断dint.intatr=TA_HLNG;dint.inthdr=Usart3Handler;//IntHandler;ercd=tk_def_int((UINT)DINTNO(USART3_IRQn),&dint);  //注册串口3中断EI(intsts);//使能所有中断while(1);
}void Usart3Handler(UINT dintno)
{B c;USART_ClearFlag(USART3,USART_FLAG_RXNE);//清除中断标志tm_putstring((UB*)"this is in usart 3 handler.\n");tk_ret_int();
}

【注意】

打开串口中断之后,原来的tm_getchar函数就不能用了。因为这个函数使用的是查询方式从串口3接收数据。

【uTenux实验】中断处理相关推荐

  1. 【uTenux实验】写在开始实验之前

    1.使用的uTenux内核代码:http://www.uloong.cc/cn/download/uTenux_V1.6.00r180.zip 2.uTenux的特性: 1.微内核  2.开放源码.完 ...

  2. c语言extend作用,extend

    这段时间在写一个预览图片的插件, 被我老大说了无数次了,不多说啥,说多了都是泪 昨天看着我的代码他说你用了extend,那你知道是什么意思吗 我只知道是扩展的意思,瞬间觉得自己弱爆了 真的 然后今天看 ...

  3. 操作系统真象还原实验记录之实验十一:实现中断处理(二)

    操作系统真象还原实验记录之实验十一:实现中断处理(二) 书p335 7.6.2 改进中断处理程序,并调快时钟 1.实验代码第一次修改 对应 书p335 7.6.2 改进中断处理程序 这次是上一次实验的 ...

  4. 中断处理过程示意图_ucore操作系统实验笔记 - Lab1

    最近一直都在跟清华大学的操作系统课程,这个课程最大的特点是有一系列可以实战的操作系统实验.这些实验总共有8个,我在这里记录实验中的一些心得和总结. Task1 这个Task主要是为了熟悉Makfile ...

  5. 实验5 :分析system_call中断处理过程

    分析system_call中断处理过程 上周我们使用gcc内嵌汇编调用系统调用,这次我们具体分析下过程. 将getpid嵌入menuos 代码从github下载,步骤如下: 1. 增加一个函数,get ...

  6. 单片机实验三(1):中断处理,定时器

    ORG 0000HLJMP STARTORG 000BH ;T0的中断矢量位置LJMP T0INTORG 0100H START: MOV TMOD,#1 ;工作方式为1MOV TH0,#4BHMOV ...

  7. io vivado 怎么查看ps_ZYNQ 7020学习笔记之PL侧普通信号中断PS的实验

    1.参考 UG585 网络笔记 2.理论知识 见中断部分 3.实验目的 练习使用PL侧的普通信号来中断PS处理器. 4.实验过程 建立工程,设置并初始化串口中断,在运行程序之后,如果串口接收到N(1- ...

  8. Linux内核设计第五周学习总结 分析system_call中断处理过程

    陈巧然原创作品 转载请注明出处   <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 使用gdb跟踪分析一 ...

  9. stm32l0的停止模式怎么唤醒_探索者 STM32F407 开发板资料连载第二十二章 待机唤醒实验

    1)实验平台:alientek 阿波罗 STM32F767 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第二十二章 待机唤醒实 ...

  10. stm32 文件系统dma大小_「正点原子NANO STM32F103开发板资料连载」第二十二章 DMA 实验...

    1)实验平台:[正点原子] NANO STM32F103 开发板 2)摘自<正点原子STM32 F1 开发指南(NANO 板-HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 ...

最新文章

  1. 【组合数学】生成函数 ( 使用生成函数求解不定方程解个数示例 2 | 扩展到整数解 )
  2. TCGA免疫浸润评价数据库,TIMER 2.0 使用指南
  3. 贪吃蛇程序 php,php Web程序 - 贪吃蛇学院-专业IT技术平台
  4. OpenGL shader normals法线贴图的实例
  5. ubuntu 14.04 编译android4.0 出现gcc-version.sh: line 11: cc: command not found错误解决方法
  6. golang日期时间格式format()
  7. 开源 java CMS - FreeCMS2.6 站点设置
  8. 手机扫描到WiFi时,WiFi站点知道吗?
  9. 普通人学python有啥用-学习Python到底有什么用?
  10. WPF应用基础篇---TreeView
  11. 在国内使用maven下载jar包非常慢的解决方法
  12. Photoshop小技巧集锦八十条
  13. wps打开pdf乱码_wps pdf转换成word乱码
  14. firefox火狐浏览器显示多列书签菜单
  15. 实验一计算机基础和网络知识竞赛,邵阳市计算机基础知识竞赛试题
  16. 让WIN2003和2008服务器iis支持安卓应用.apk文件下载的配置方法
  17. APP推广要做哪些?渠道?方案?竞争分析?
  18. Vue教程-可视化图表
  19. 实时数据库历史数据容量的计算方法
  20. 基于cocos2dx的2D手游美术资源制作技术选型(1)(2)

热门文章

  1. Kubernetes API的版本控制,分组,对象,访问控制
  2. 蒙特卡洛树搜索算法(UCT): 一个程序猿进化的故事
  3. 天池客流预测–GBDT
  4. 【ML小结5】决策树(ID3、C4.5、CART)
  5. 最新回归算法理解、实现及应用(1)线性回归
  6. 【POJ 3041】Asteroids【网络流 —— 最小点覆盖】
  7. Raki的读paper小记:MEMORY REPLAY WITH DATA COMPRESSION FOR CONTINUAL LEARNING
  8. mycat-mysql读写分离
  9. mybatisplus activerecord之mybatisplus entity XXX Not Found TableInfoCache.错误
  10. 基于Ubuntu的ESP32平台搭建