FreeRTOS学习记录 01--中断管理

这篇博客介绍了Cortex-M中断管理,包括NVIC的中断配置、优先级分组以及FreeRTOS中PendSv和Systick中断的优先级配置。还探讨了FreeRTOS的临界段代码保护,讲解了如何进入和退出中断临界段。
摘要由CSDN通过智能技术生成

0 前言

@ Author         :Dargon
@ Record Date    :2021/07/11
@ Reference Book : `FreeRTOS源码详解与应用开发`,`ARM Cortex-M3与Cortex-M4权威指南`,`B站正点原子FreeRTOS讲解视频`
@ Purpose        :学习正点原子的miniFly,该飞控基于FreeRTOS系统开发的,所以学习一下记录下关于RTOS系统的一些基本操作,大概了解系统的工作原理,如何创建,运行,切换任务等等基本操作流程。在此进行学习的记录。

1 Cortex-M 中断管理

1.1 中断配置

  • Cortex-M 内核中MCU提供一个用于中断管理的嵌套向量中断控制器,NVIC (Nested Vectored Interrupt Controller)
  • NVIC最多支持 240个IRQ 中断请求,一个不可屏蔽中断(不知道什么),一个systick(滴答定时器),和多个系统异常。
  • 管理这些寄存器的区域大都在控制块 NVIC 和 SCB 中,将其定义在结构体NVIC_Type 和SCB_Type中。
  • 从代码中看一下实际对应的内存地址
  • 位于文件core_cm4.h中
/* Memory mapping of Cortex-M4 Hardware */
#define SCS_BASE            (0xE000E000UL)                            /*!< System Control Space Base Address  */
#define SysTick_BASE        (SCS_BASE +  0x0010UL)                    /*!< SysTick Base Address               */
#define NVIC_BASE           (SCS_BASE +  0x0100UL)                    /*!< NVIC Base Address                  */
#define SCB_BASE            (SCS_BASE +  0x0D00UL)                    /*!< System Control Block Base Address  */

#define SCnSCB              ((SCnSCB_Type    *)     SCS_BASE      )   /*!< System control Register not in SCB */
#define SCB                 ((SCB_Type       *)     SCB_BASE      )   /*!< SCB configuration struct           */
#define SysTick             ((SysTick_Type   *)     SysTick_BASE  )   /*!< SysTick configuration struct       */
#define NVIC                ((NVIC_Type      *)     NVIC_BASE     )   /*!< NVIC configuration struct          */

  • 可以计算出对应的 起始地址NVIC =SCS_BASE + 0x0100UL =0xE000E000UL + 0x0100UL =0xE000 E100UL
  • 可以计算出对应的 起始地址SCB =SCS_BASE + 0x0D00UL =0xE000E000UL + 0x0D00UL =0xE000 ED00UL
  • 下面看两个结构体 NVIC_Type 和SCB_Type的变量定义
  • 位于文件core_cm4.h中

typedef struct
{
   
	// --对应8*32 =256 对应240个外部中断
  __IO uint32_t ISER[8];                 /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register           */
       uint32_t RESERVED0[24];
	// --关于Offset =0x80情况 (24+8)*32/4 =128 Byte字节 =0x80,注意32位bit 是占用4 Byte字节
  __IO uint32_t ICER[8];                 /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register         */
       uint32_t RSERVED1[24];
  __IO uint32_t ISPR[8];                 /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register          */
       uint32_t RESERVED2[24];
  __IO uint32_t ICPR[8];                 /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register        */
       uint32_t RESERVED3[24];
  __IO uint32_t IABR[8];                 /*!< Offset: 0x200 (R/W)  Interrupt Active bit Register           */
       uint32_t RESERVED4[56];

  __IO uint8_t  IP[240];                 /*!< Offset: 0x300 (R/W)  Interrupt Priority Register (8Bit wide) */
       uint32_t RESERVED5[644];
	
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值