中断处理是一个比较有意思的东西。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. 【uTenux实验】任务管理

    任务就是一个无限循环.uTenux提供的任务管理功能是很强大的,包括建立和删除一个任务,启动或退出任务,取消一个任务的启动请求,改变任务的优先级和査询任务状态,使任务进人睡眠状态和唤醒状态,取消唤醒请 ...

  3. 【uTenux实验】信号量

    信号量(semaphore)是一个用来指示可用的资源并将可用资源的数量以数值的形式表示出来的对象.当使用一组资源时,信号量用来实现互斥控制和同步.uTenux提供了信号量出来的API,可以很方便地使用 ...

  4. 【uTenux实验】事件标志

    事件标志是一个用来实现同步的对象,由多个位组成,用作指示对应事件存在的标志.事件标志由用来指示对应事件存在的位模式(bitpattern)和一个等待事件标志的任务队列组成. uTenux提供了一组AP ...

  5. 【uTenux实验】邮箱

    邮箱是一个通过在系统(共享)内存空间传递消息来实现同步和通信的对象.uTenux中每个邮箱都包含一个用来发送消息的消息队列和一个用于等待接收消息的任务队列,其使用邮箱功能的消息内容放置在发送方和接收方 ...

  6. 【uTenux实验】互斥体

    互斥体,维基百科中交互斥锁.其定义是这样的:互斥锁(英语:英语:Mutual exclusion,缩写 Mutex)是一种用于多线程编程中,防止两条线程同时对同一公共资源(比如全局变量)进行读写的机制 ...

  7. 【uTenux实验】消息缓冲区

    uTenux的消息缓冲区是一个通过传递大小可变的消息来实现同步和通信的对象. 消息缓冲区由三部分组成:1.待发消息队列  2.等接收消息的任务队列  3.用来保存缓冲消息的空间. 和信号相比,消息队列 ...

  8. 【uTenux实验】集合点端口

    这个是头一次接触的概念.比较不好理解.内核规范中的说明就要20页! 看了王总写的uTenux内核规范之后,有那么一点明白了但理解不深. 集合点端口就像每次工作前的收集情况会.首长下达收集情况指令,各个 ...

  9. 【uTenux实验】内存池管理(固定内存池和可变内存池)

    1.固定内存池管理实验 内存管理是操作系统的一个基础功能.uTenux的内存池管理函数提供了基于软件的内存池管理和内存块分配管理.uTenux的内存池有固定大小的内存池和大小可变的内存池之分,它们被看 ...

随机推荐

  1. hibernateValidate

    1.创建主页面 <form action="${pageContext.request.contextPath }/first.do" method="post&q ...

  2. SQLServer更新语句要注意

    在SQLServer中 update语句中对于表不能使用别名 eg:update table a set a.column="" where ... 这样在SQLServer中是不 ...

  3. sql中replace函数与like结合达到提换的效果

    create table ts ( idd varchar() , co1 varchar() , co2 varchar() , co3 varchar() , gai varchar() ); i ...

  4. Hadoop学习资料

    转自:http://cloud21.iteye.com/blog/607175 第一手资源 hadoop官方网站 hadoop.apache.org 最权威的官方资源之一 dev.yahoo.hado ...

  5. Bean property '**DAO' is not writable or has an invalid setter method

    ApplicationContext.xml中配置有问题,里面的bean的属性名称写错了. ApplicationContext.xml中写的是loginDAO,在java类里配置的bean却写成了l ...

  6. 2-legged oauth & 3-legged oauth

    3-legged oauth resource owner, client, server. resource owner 给client访问权限去访问resource owner在server上的r ...

  7. WCF终结点配置

    错误信息:已有针对 IP 终结点 127.0.0.1:8235 的侦听器.如果有其他应用程序已在侦听此终结点,或者,如果在服务主机中具有多个服务终结点,这些终结点具有相同的 IP 终结点但绑定配置不兼 ...

  8. c语言求平面上2个坐标点的直线距离、求俩坐标直线距离作为半径的圆的面积、递归、菲波那次数列、explode

    #include <stdio.h> #include <math.h> #include <string.h> char explode( char * str ...

  9. Android FM模块学习之三 FM手动调频

    前一章主要是FM的自动调频, 接下来我们就看看FM手动调频是如何进行的.如果不清楚FM自动调频的过程,请打开超链接查看FM搜索频率流程. 首先来看一下流程图: 2.滑动刻度盘HorizontalNum ...

  10. sqlite 删除表中重复数据(亲测可用)

    例子:表名  Paper .通过字段PaperID查找重复数据. 1 --查询某表中重复的数据       select * from Paper group by PaperID having co ...