1902_野火FreeRTOS教程内核在STM32中用到的2个中断PENDSV和SYSTICK

这篇具有很好参考价值的文章主要介绍了1902_野火FreeRTOS教程内核在STM32中用到的2个中断PENDSV和SYSTICK。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1902_野火FreeRTOS教程内核在STM32中用到的2个中断PENDSV和SYSTICK

全部学习汇总: g_FreeRTOS: FreeRTOS学习笔记 (gitee.com)

1902_野火FreeRTOS教程内核在STM32中用到的2个中断PENDSV和SYSTICK,FreeRTOS,stm32,javascript,嵌入式硬件

上面是涉及到的源代码,而这次需要分析的就是78、79行的两个中断。首先,需要确认NVIC_SYSPRI2寄存器的作用。

1902_野火FreeRTOS教程内核在STM32中用到的2个中断PENDSV和SYSTICK,FreeRTOS,stm32,javascript,嵌入式硬件

进一步看里面相关的定义,从这里看这个注释与代码出现了不一致的地方。也就是这个0xe000ed20地址究竟是哪一个寄存器的地址,注释与代码的描述并不相同。

1902_野火FreeRTOS教程内核在STM32中用到的2个中断PENDSV和SYSTICK,FreeRTOS,stm32,javascript,嵌入式硬件

这么看,注释写的应该是更加准确一些。

1902_野火FreeRTOS教程内核在STM32中用到的2个中断PENDSV和SYSTICK,FreeRTOS,stm32,javascript,嵌入式硬件

这里,进一步补充一下对应的寄存器信息如上述截图。

void print_regs_info(void)
{
    printf("portNVIC_PENDSV_PRI = %x\n", portNVIC_PENDSV_PRI);
    printf("portNVIC_SYSTICK_PRI = %x\n", portNVIC_SYSTICK_PRI);
}

1902_野火FreeRTOS教程内核在STM32中用到的2个中断PENDSV和SYSTICK,FreeRTOS,stm32,javascript,嵌入式硬件

增加上面的代码,直接打印一下结果如上。那么,上面的两个寄存器设置其实是把高位的两个字节全都设置为了每一个bit都是1。

1902_野火FreeRTOS教程内核在STM32中用到的2个中断PENDSV和SYSTICK,FreeRTOS,stm32,javascript,嵌入式硬件

再次结合这一个信息,上面的操作有效的部分其实是把这两个字节的高4bit全都设置为了1。

1902_野火FreeRTOS教程内核在STM32中用到的2个中断PENDSV和SYSTICK,FreeRTOS,stm32,javascript,嵌入式硬件

再结合这部分信息,可以看得出来注释的描述其实是对的。这两个语句的操作实现的功能更是把Systick以及PendSV中断的优先级设置为15,也就是最低。其实,功能分析到此,现在这两个中断的优先级究竟应该设置为多少是合理的暂且还是不明确的。

1902_野火FreeRTOS教程内核在STM32中用到的2个中断PENDSV和SYSTICK,FreeRTOS,stm32,javascript,嵌入式硬件

接下来,再看一下启动第一个任务的实现。首先看93行,这个是KEIL中的一个伪指令,主要实现的功能是保证汇编代码中的堆栈能够按照8字节对齐。那么,0xE000ED08这个地址是哪个寄存器呢?按照注释,直接找一下文档看看是否一致。

1902_野火FreeRTOS教程内核在STM32中用到的2个中断PENDSV和SYSTICK,FreeRTOS,stm32,javascript,嵌入式硬件

首先确认SCB的基地址,接下来看偏移量。

1902_野火FreeRTOS教程内核在STM32中用到的2个中断PENDSV和SYSTICK,FreeRTOS,stm32,javascript,嵌入式硬件

偏移量从手册中查出来是0x08,因此两个组合出来的这个地址就是SCB_VTOR的地址。那么,这个寄存器中的数值现在是多少呢?直接通过代码打印一下,对应的测试代码:

void print_regs_info(void)
{
    /*ldr r0, =0xE000ED08
    ldr r0, [r0]
    ldr r0, [r0]*/

    uint32_t reg_value = 0xE000ED08;

    printf("result 1: 0x%x\n", reg_value);
    reg_value = *((uint32_t *)reg_value);
    printf("result 2: 0x%x\n", reg_value);
    reg_value = *((uint32_t *)reg_value);
    printf("result 3: 0x%x\n", reg_value);
}

调用的位置在调度器启动之前。

1902_野火FreeRTOS教程内核在STM32中用到的2个中断PENDSV和SYSTICK,FreeRTOS,stm32,javascript,嵌入式硬件

这是打印出来的效果。

这样,继续之前的汇编第102行。这一个操作实现的额是给msp设置数值为0x20001780。

1902_野火FreeRTOS教程内核在STM32中用到的2个中断PENDSV和SYSTICK,FreeRTOS,stm32,javascript,嵌入式硬件

这个地址区从手册中可以查出来是SRAM的区域,这样,这一句实现的作用就是设置了堆栈在RAM区域的位置。

1902_野火FreeRTOS教程内核在STM32中用到的2个中断PENDSV和SYSTICK,FreeRTOS,stm32,javascript,嵌入式硬件

这跟直接从仿真器中看到的寄存器数值也是一致的。各种仿真器千差万别,有时候觉得最顺手的似乎还是printf。

1902_野火FreeRTOS教程内核在STM32中用到的2个中断PENDSV和SYSTICK,FreeRTOS,stm32,javascript,嵌入式硬件

上面的这个MSP的操作看起来的确是有一点莫名其妙,或许是为了兼容不同的启动代码而设计?

继续往下,主动产生一次系统调用。这里的参数0会被处理器给忽略掉,没有什么实际的作用。为什么还有这么一个参数,主要还是为了保证语法的正确性吧。文章来源地址https://www.toymoban.com/news/detail-834061.html

到了这里,关于1902_野火FreeRTOS教程内核在STM32中用到的2个中断PENDSV和SYSTICK的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32 freertos多任务状态迁移,中断临界段,任务延时

    arm中SP,LR,PC寄存器以及其它所有寄存器以及处理器运行模式介绍 特权级与用户级的区别主要是某些寄存器能不能访问与修改: cortex M3/M4内核 特权级与用户级详解 Cortex-M3双堆栈MSP和PSP Cortex-M3双堆栈MSP和PSP M3内核何时使用MSP何时使用PSP? 特权级可以使用MSP 和PSP指针 用户级

    2024年02月12日
    浏览(57)
  • STM32 hal库使用笔记之FreeRTOS—任务创建、删除,任务挂起、恢复,任务中断管理

    一、简介 1.FreeRTOS简介     RTOS全称为:Real Time OS,就是实时操作系统,强调的是:实时性。而Free显而易见体现的是其免费性。总的来说这是一个免费的嵌入式实时操作系统。     其特点是:免费开源、可剪裁(独立性强,适应范围广)、简单、优先级/任务不限(但是受到不

    2024年02月04日
    浏览(51)
  • 基于STM32的实时操作系统FreeRTOS移植教程(手动移植)_stm32移植freertos(1)

    直接意识代码: 这是我们大脑最希望的添加代码方式,很显然他是 错的 , 两个任务之间产生了相互的影响 ,使得两个任务都执行错误,这种思想在 裸机开发 中肯定是 错的 ,但是在我们的 RTOS 中他就可以是 对的 。 任务型代码: 这是 独立的两个任务内容 ,我们只需要把

    2024年04月10日
    浏览(109)
  • FreeRTOS在Cortex-M系列内核中遇到的关于系统滴答中断的问题

    众所周知,在Cortex-M内核中,系统节拍由Systick时钟提供,当配置好系统滴答时钟后,每次时钟中断就会触发中断处理函数 xPortSysTickHandler(),   这部分主要是依靠  xTaskIncrementTick(), 来判断任务切换是否在此次系统时钟中断时被需要。如果是,则PendSV标记置位,等待触发PendS

    2024年02月08日
    浏览(46)
  • 【STM32教程】第四章 STM32的外部中断EXTI

    案例代码及相关资料下载链接: 链接:https://pan.baidu.com/s/1hsIibEmsB91xFclJd-YTYA?pwd=jauj  提取码:jauj   中断系统的定义:中断是指在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂

    2024年02月09日
    浏览(49)
  • STM32CUBUMX配置RS485(中断接收)--保姆级教程

    ———————————————————————————————————— ⏩ 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的大三学生。 ⏩最近在开发一个STM32H723ZGT6的板子,使用STM32CUBEMX做了很多驱动,包括ADC、UART、RS485、EEPROM(IIC)、FLASH(SPI)等等。

    2024年02月16日
    浏览(70)
  • 野火stm32指南者开发板点亮LED

    目录 1.芯片手册中的LED电路图 2.官网手册 3.代码演示 3.1 stm32f10x.h 头文件 3.2 点亮绿灯 3.3 点亮蓝灯 3.4 点亮红灯 3.5 LED灯闪烁,绿灯闪烁 。 3.6 红绿蓝三色LED灯切换闪烁 3.1 stm32f10x.h 头文件 3.2 点亮绿灯 3.3 点亮蓝灯 3.4 点亮红灯 3.5 LED灯闪烁,绿灯闪烁 。 3.6 红绿蓝三色LED灯切

    2024年02月13日
    浏览(43)
  • LVGL触摸移植——stm32野火F103

    目录 系列文章目录 章目录 目标 一、认识端口文件 二、使能 lv_port_indev.c  三、接口函数 1.输入设备初始化 四、Main函数 五、过程中的疑难杂症 1.内存不足 2、LCD白屏 五、效果 总结 在显示的基础上添加触摸输入 提示:以下是本篇文章正文内容,下面案例可供参考 这两个是

    2024年02月11日
    浏览(47)
  • stm32使用HAL库配置串口中断收发数据(保姆级教程)

    最近在学习使用hal库,之前都是用标准库来写32代码,所以发个帖子记录一下学习过程,同时也希望能帮助到一些也在学习HAL库的同学。 接下来进入正题 串口中断是指当单片机收到一个串口数据时,单片机会产生一个中断信号,通知处理器中断服务程序去处理这个接收到的数

    2024年02月07日
    浏览(43)
  • FreeRTOS教程3 中断管理

    正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) Keil µVision5 IDE(MDK-Arm) 野火DAP仿真器 XCOM V2.6串口助手 本文主要学习 FreeRTOS 中断管理的相关知识, 包括系统硬件中断、 FreeRTOS 可管理的中断、中断屏蔽和一些其他注意事项等知识 根据STM32CubeMX教程4 EXTI 按键外部

    2024年03月13日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包