【LiteOS】08-开发内核-中断机制

此笔记由个人整理

华为IOT LiteOS开发实战营

第三天

一、简介

  • 中断是指出现需要时,**CPU暂停执行当前程序,转而执行新程序的过程。**即在程序运行过程中,系统出现了一个必须由CPU立即处理的事务。此时,CPU暂时中止当前程序的执行转而处理这个事务,这个过程就叫做中断。
  • 通过中断机制,在外设不需要CPU介入时,CPU可以执行其它任务,而当外设需要CPU时通过产生中断信号使CPU立即中断当前任务来响应中断请求。这样可以使CPU避免把大量时间耗费在等待、查询外设状态的操作上,因此将大大提高系统实时性以及执行效率。

image-20200528224140784

  • 中断硬件分类
    • 设备:发起中断的源,当设备需要请求CPU时,产生一个中断信号,该信号连接至中断控制器。
    • 中断控制器:中断控制器是CPU众多外设中的一个,它一方面接收其它外设中断引脚的输入,另一方面,它会发出中断信号给CPU。可以通过对中断控制器编程实现对中断源的优先级、触发方式、打开和关闭源等设置操作。
    • CPU本身:CPU会响应中断源的请求,中断当前正在执行的任务,转而执行中断处理程序

二、名词解释

  • 中断号:每个中断请求信号都会有特定的标志,设备提出的中断请求让计算机判断,这个标志为中断号。
  • 中断请求:“紧急事件”需向CPU提出申请(发一个电脉冲信号),要求中断,及要求CPU暂停当前执行的任务,转而处理该“紧急事件”,这一申请过程称为中断申请。
  • 中断优先级:为使系统能够及时响应并处理所有中断,系统根据中断时间的重要性和紧迫程度,将中断源分为若干个级别,称作中断优先级。HuaweiLiteOS支持中断控制器的中断优先级及中断嵌套,同时中断管理未对优先级和嵌套进行限制。
  • 中断处理程序:当外设产生中断请求后,CPU暂停当前的任务去响应中断申请,即执行中断处理程序。
  • 中断触发:中断源发出并送给CPU控制信号,将接口卡上的中断触发器置“1”,表明该中断源产生了中断,要求CPU去响应该中断,CPU暂停当前任务,执行相应的中断处理程序。
  • 中断触发类型:外部中断申请通过一个物理信号发送到NVIC,可以是电平触发或边沿触发。
  • 中断向量:中断服务程序的入口地址。
  • 中断向量表:存储中断向量的存储区,中断向量与中断号对应,中断向量在中断向量表中按照中断号顺序存储

三、应用场景及开发流程

应用场景

  • **当有中断请求产生时,CPU暂停当前的任务,转而去响应外设请求。**根据需要,用户通过中断申请,注册中断处理程序,可以指定CPU响应中断请求时所执行的具体操作。

开发流程

  • 1、修改target_config.h中的配置项
    • 打开硬中断裁剪开关:LOSCFG_PLATFORM_HWI定义为YES
    • 配置硬中断使用最大数:LOSCFG_PLATFORM_HWI_LIMIT
  • 2、初始化硬件中断。
  • 3、调用中断创建接口函数创建中断,根据需要使能指定中断。

a)根据具体硬件,配置支持的最大中断数及中断初始化操作的寄存器地址。

b)中断处理程序耗时不能过长,影响CPU对中断的及时响应。

c)关中断后不能执行引起调度的函数。

d)Cortex-M系列处理器中1-15中断为内部使用,因此不建议用户去申请和创建。

四、操作系统抽象层

  • 硬中断创建,注册硬中断处理程序
osal_int_connect(int intnum,int prio,int mode,fn_interrupt_handle callback,void*arg);

image-20200528230006997

五、实践代码

  • 创建任务,选择中断案例

基础实验

  • 1、初始化硬件中断:自己根据硬件情况来添加。
  • 2、中断注册:选择需要注册的中断号,优先级,中断入口函数、中断入口函数形参。
  • 3、触发中断:需要外部或内部触发,中断函数才会执行。
  • 4、查看打印结果:中断函数中实现打印功能。
#include <stdint.h>
#include <stddef.h>
#include <string.h>

#include <osal.h>
#include "stm32l4xx_hal.h"
uint32_t sum1;
uint32_t sum2;
static int app_hello_world_entry()
{
    while (1)
    {
        printf("Hello World! This is Bearpi!\r\n");
        osal_task_sleep(4*1000);
    }
}
static Key1_interrupt_entry()//按键1中断任务
{
   
    printf("KEY1 Interrupt entry OK!,sum1:%d\r\n",sum1++);//触发一次按键1中断,按键1计数和加一
    __HAL_GPIO_EXTI_CLEAR_FLAG(GPIO_PIN_2);//清除按键1标志
}
static Key2_interrupt_entry()//按键2中断任务
{
   
    printf("KEY2 Interrupt entry OK!,sum2:%d\r\n",sum2++);//触发二次按键1中断,按键1计数和加一
    __HAL_GPIO_EXTI_CLEAR_FLAG(GPIO_PIN_3);//清除按键2标志
}
int standard_app_demo_main()
{
    osal_task_create("helloworld",app_hello_world_entry,NULL,0x400,NULL,2);
    osal_int_connect( EXTI2_IRQn, 3, NULL, Key1_interrupt_entry, NULL);//硬中断创建
    osal_int_connect( EXTI3_IRQn, 4, NULL, Key2_interrupt_entry, NULL);//硬中断创建
    return 0;
}


  • 结果

image-20200528234955179

扩展实验

  • 1、注释掉此代码:__HAL_GPIO_EXTI_CLEAR_FLAG(GPIO_PIN_3);会有什么现象。

  • 2、通过另一种方式实现中断的调用。

  • 去除后的现象:没有跳出中断触发,无限快速循环

image-20200528235425586

  • 直接使用32的中断回调函数
#include <stdint.h>
#include <stddef.h>
#include <string.h>

#include <osal.h>
#include "stm32l4xx_hal.h"
#include "stm32l4xx_it.h"
uint32_t sum1;
uint32_t sum2;
static int app_hello_world_entry()
{
    while (1)
    {
        printf("Hello World! This is Bearpi!\r\n");
        osal_task_sleep(4*1000);
    }
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//使用回调函数,判断哪个按键按下
{
    switch (GPIO_Pin)
    {
    case GPIO_PIN_2:
        printf("KEY1 EXTI_Callback entry OK!,sum1:%d\r\n",sum1++);
        break;
    case GPIO_PIN_3:
        printf("KEY2 EXTI_Callback entry OK!,sum2:%d\r\n",sum2++);
        break;
    default:
        break;
    }
}
int standard_app_demo_main()
{
    osal_task_create("helloworld",app_hello_world_entry,NULL,0x400,NULL,2);
    osal_int_connect( EXTI2_IRQn, 3, NULL, Key1_IRQHandler, NULL);
    osal_int_connect( EXTI3_IRQn, 4, NULL, Key2_IRQHandler, NULL);
    return 0;
}
  • 结果

image-20200529001928752

第三天内核部分就完了,初步掌握了互斥锁、内存管理、信号量等操作系统方面的知识,收获还是挺多的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值