2254|1

32

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

[MsgOS]异常向量处理 [复制链接]

本帖介绍MsgOS中异常向量处理的相关部分。

对于大部分cortex-m3内核单片机软件工程,尤其是STM32F系列的,与异常相关的代码部分如下:
1.在由汇编编写的源文件中,弱定义一个中断向量表,且把大部分中断函数弱定义为死循环函数。
2.向量表首项为主堆栈初始值,是在汇编源文件中分配一段静态RAM区,将该内存段的尾地址作为向量表首相。
3.向量表第二项为复位向量,一般会先调用时钟初始化再调用_main。
4.有一对专门为重定义中断函数的.c和.h源文件,实际的中断响应函数都在此文件中进行重定义,函数名要和汇编中对应一致。




MsgOS中对异常向量是这样处理的,
1.os_vector.c源文件中定义了中断向量表,但只包括前16个系统异常。系统异常响应函数是在汇编中实现的,后面的外设中断只是由宏VECTOR_REG(handler,IRQn)来定义的。
2.为了最大化利用芯片RAM空间和最大化主堆栈空间,主堆栈初始化值是由芯片RAM区尾地址确定的。
3.复位向量只调用了_main函数,避免了不同芯片时钟初始化的差异性,及系统复位后只使用硬件默认时钟,修该系统时钟的驱动应该到应用层再去调用。
4.具备对系统异常hardfault、memmanage, busfault和usagefault的分析处理功能,便于异常原因分析和判断。
5.滴答定时器(systick)用于内核心跳中断,可悬起系统调用(pendsv)





os_vector.c源文件现有的内容为以下部分
1.系统异常向链表定义
2.向量表初始化
3.系统异常处理


os_asm.asm源文件主要内容如下
1.系统异常响应处理
2.时间轴打点函数
3.微库适配处理

向量表初始化中会获取实际系统中断优先级位数和实际外部中断个数,会将中断响应优先级全设置为抢占优先级。凡是与系统向量表及前16个系统异常相关的操作都应由MsgOS来处理,其余的外设中断则应该做为驱动部分来编写,通过CPU_NVIC_SetPriority设置优先级,CPU_NVIC_EnableIRQ来允许中断,VECTOR_REG来注册中断。
这样做一是减少了存储消耗,只有用到的外部中断才会占用空间;二是和具体的单片机型号无关了,模块化和可移植性得以提高,因为每一种具体型号单片机其外设中断都是不同的,预定义的那个中断向量表必定需要和芯片型号关联。


以串口中断处理为例,源码如下(源文件在MsgOS\bsp\stm32f10x\device\uart.c):

  1. void UART1_Configuration(void)
  2. {
  3.   GPIO_InitTypeDef    GPIO_InitStructure;
  4.   USART_InitTypeDef   USART_InitStructure;
  5.   NVIC_InitTypeDef    NVIC_InitStructure;


  6.    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO , ENABLE);
  7.     /* 配置 USART1_TX   PA.9 */
  8.     GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
  9.     GPIO_InitStructure.GPIO_Pin   =  GPIO_Pin_9;
  10.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  11.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  12.     /* 配置 USART1_RX          PA.10  */
  13.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//GPIO_Mode_IN_FLOATING;
  14.     GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_10;
  15.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  16.    
  17.                   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  18.                 /* USARTx configuration ------------------------------------------------------*/
  19.                   /* USARTx configured as follow:
  20.                         - BaudRate = 115200 baud  
  21.                         - Word Length = 8 Bits
  22.                         - One Stop Bit
  23.                         - No parity
  24.                         - Hardware flow control disabled (RTS and CTS signals)
  25.                         - Receive and transmit enabled
  26.                   */
  27.                   USART_InitStructure.USART_BaudRate = 115200;
  28.                   USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  29.                   USART_InitStructure.USART_StopBits = USART_StopBits_1;
  30.                   USART_InitStructure.USART_Parity = USART_Parity_No ;
  31.                   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  32.                   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  33.                
  34.                   USART_Init(USART1, &USART_InitStructure);
  35.                   USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  36.                   USART_ClearFlag(USART1,USART_FLAG_TC);//防止无法输出复位后的首字符
  37.                   USART_Cmd(USART1, ENABLE);

  38.   
  39.           /* Enable the USART2 Interrupt */
  40.           CPU_NVIC_SetPriority(USART1_IRQn,0);//设置串口1中断优先级为0
  41.           CPU_NVIC_EnableIRQ(USART1_IRQn);//允许串口1中断       
  42. }  

  43. void USART1_IRQHandler(void)
  44. {
  45.    char  c;
  46.     //接收中断
  47.     if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)        //判断是否为串口1接收到数据中断
  48.    {                                                        
  49.                         c=USART_ReceiveData(USART1); //读取USART接收到的数据
  50.                         if(uart_recv_uart1.length<256)
  51.                         {
  52.                                 uart_recv_uart1.buf[uart_recv_uart1.position_irq++]=c;
  53.                                 uart_recv_uart1.length++;
  54.                         }       
  55.                         USART_ClearITPendingBit(USART1,  USART_IT_RXNE);  //清除中断标志
  56.    }
  57.    
  58. }
  59. VECTOR_REG(USART1_IRQHandler,USART1_IRQn);//注册串口1中断响应函数
复制代码


此帖出自stm32/stm8论坛

最新回复

汇总帖在此: [MsgOS]——by 科技猎人 https://bbs.eeworld.com.cn/forum ... 3237&fromuid=536508   详情 回复 发表于 2016-6-27 08:49

赞赏

1

查看全部赞赏

点赞 关注
 

回复
举报

1万

帖子

203

TA的资源

管理员

沙发
 
汇总帖在此:
[MsgOS]——by 科技猎人
https://bbs.eeworld.com.cn/forum ... 3237&fromuid=536508

此帖出自stm32/stm8论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名玩板看这里:
https://bbs.eeworld.com.cn/elecplay.html
EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表