• 【uTenux实验】中断处理


        中断处理是一个比较有意思的东西。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.
    ");
      tk_ret_int();
    }

    【注意】

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

  • 相关阅读:
    redis 用scan 代替keys 解决百万数据模糊查询超时问题
    集成spring-ldap
    IDEA报Unable to save settings: Failed to save settings. Please restart IntelliJ IDEA随后闪退
    struts2响应文件 struts2下载txt
    QRCodeUtil 二维码生成 解析 带图片与不带图片的二维码
    java 手机号正则表达式 截止2019年6月最新
    Java遍历Map对象的四种方式效率对比
    SpringCloud Alibaba系列(二) Nacos高可用和持久化
    SpringCloud Alibaba系列(二) Nacos配置中心-分类配置
    SpringCloud Alibaba系列(二) Nacos使用
  • 原文地址:https://www.cnblogs.com/zyqgold/p/3171232.html
Copyright © 2020-2023  润新知