STM32-调用 vTaskStartScheduler API 后出现 HardFault

这篇具有很好参考价值的文章主要介绍了STM32-调用 vTaskStartScheduler API 后出现 HardFault。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

STM32 移植 FreeRTOS 后调用 vTaskStartScheduler() 后出现 HardFault 异常。

原因分析:

FreeRTOS 配置头文件 FreeRTOSConfig.h 中与中断有关的配置和通过系统接口 void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup) 设置的中断分组冲突。

/* The lowest interrupt priority that can be used in a call to a "set priority"
function. */
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY   15

/* The highest interrupt priority that can be used by any interrupt service
routine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL
INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER
PRIORITY THAN THIS! (higher priorities are lower numeric values. */
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5

/* Interrupt priorities used by the kernel port layer itself.  These are generic
to all Cortex-M ports, and do not rely on any particular library functions. */
#define configKERNEL_INTERRUPT_PRIORITY 		( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 	( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

FreeRTOSConfig.h 中设置的中断最低优先级为 15,说明 可编程中断优先级的范围为 0 ~ 15,也即需要 4 bits 来表示抢占优先级。而通过 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0) API 设置为 0 bit 用于抢占优先级3 bits 用于子优先级,与 FreeRTOSConfig.h 中的中断设置冲突导致。

/** @defgroup Preemption_Priority_Group 
  * @{
  */

#define NVIC_PriorityGroup_0         ((uint32_t)0x700) /*!< 0 bits for pre-emption priority
                                                            4 bits for subpriority */
#define NVIC_PriorityGroup_1         ((uint32_t)0x600) /*!< 1 bits for pre-emption priority
                                                            3 bits for subpriority */
#define NVIC_PriorityGroup_2         ((uint32_t)0x500) /*!< 2 bits for pre-emption priority
                                                            2 bits for subpriority */
#define NVIC_PriorityGroup_3         ((uint32_t)0x400) /*!< 3 bits for pre-emption priority
                                                            1 bits for subpriority */
#define NVIC_PriorityGroup_4         ((uint32_t)0x300) /*!< 4 bits for pre-emption priority
                                                            0 bits for subpriority */

解决方案:

将中断分组设置为 NVIC_PriorityGroup_4 即可。FreeRTOS 官方文档 也建议对于 STM32 (Cortex-M3),建议设置为 NVIC_PriorityGroup_4

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

STM32-调用 vTaskStartScheduler API 后出现 HardFault,STM32,stm32,嵌入式硬件,单片机,经验分享,mcu


题外:

这里顺便也记录下 STM32 (Cortex-M3) 结合 FreeRTOS 对中断的设置。

STM32 (Cortex-M3)SCB_AIRCR 寄存器中的 Bits 10:9 设置中断优先级分组。

STM32-调用 vTaskStartScheduler API 后出现 HardFault,STM32,stm32,嵌入式硬件,单片机,经验分享,mcu

STM32-调用 vTaskStartScheduler API 后出现 HardFault,STM32,stm32,嵌入式硬件,单片机,经验分享,mcu

FreeRTOS 在配置文件 FreeRTOSConfig.h 中通过宏 configKERNEL_INTERRUPT_PRIORITYconfigMAX_SYSCALL_INTERRUPT_PRIORITY 来设置 FreeRTOS 中的中断设置。

  • configKERNEL_INTERRUPT_PRIORITY 用于设置中断最低优先级。这个宏必须结合 void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup) 来设置。
  • configMAX_SYSCALL_INTERRUPT_PRIORITY 用于 FreeRTOS 中的一些中断功能。典型应用就是 FreeRTOS 中以 FromISR 结尾的 API 可以安全的在 configMAX_SYSCALL_INTERRUPT_PRIORITY ~ configKERNEL_INTERRUPT_PRIORITY 之间的中断回调中使用。对于这部分描述,可以参考下图或者 FreeRTOS 官方文档中对 FreeRTOSConfig.h 中宏的说明。

STM32-调用 vTaskStartScheduler API 后出现 HardFault,STM32,stm32,嵌入式硬件,单片机,经验分享,mcu文章来源地址https://www.toymoban.com/news/detail-816275.html

到了这里,关于STM32-调用 vTaskStartScheduler API 后出现 HardFault的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Vue调用后端api接口出现跨域问题,只要三步解决问题

    问题: 当我们在自己的个人电脑上去进行vue调用后端的操作时,经常会遇到跨域问题 解决方式: 1.在Vue项目中调用api接口的地方加上 2.在后端代码项目重写Filter类 3. 在控制类方法上加上允许跨域的注解 搞定收工:  

    2024年02月15日
    浏览(35)
  • 前端调用DRI后端API出现跨域资源共享(CORS)问题解决办法

    目录 1. 引言 2. 跨源资源共享和实现方法 3. 在Django项目中配置django-cors-headers库 Reference 在进行后端API开发时,有时会遇到“跨域资源共享 (CORS) 请求...被阻止“的错误,如图1所示。本文讲解如何在使用DRF(Django REST Framework)的后端API开发项目中解决这个问题。 A cross-origin re

    2024年04月25日
    浏览(51)
  • 【STM32】STM32F4调用DSP库实现FFT运算

    最近在整理之前的stm32笔记,打算把一些有价值的笔记发到CSDN分享一下。 在进行模拟/数字信号的转换过程中,当采样频率F大于信号中最高频率 fmax 的 2 倍时(F2*fmax),采样之后的数字信号完整地保留了原始信号中的信息。 设采样频率(单位时间可以采多少个信号样本)为 F

    2023年04月24日
    浏览(37)
  • STM32调用DSP函数方法

    ..DriversCMSISDSPIncludearm_math.h(341): error:  #35: #error directive: \\\"Define according the used Cortex core ARM_MATH_CM7, ARM_MATH_CM4, ARM_MATH_CM3, ARM_MATH_CM0PLUS, ARM_MATH_CM0, ARM_MATH_ARMV8MBL, ARM_MATH_ARMV8MML\\\"     #error \\\"Define according the used Cortex core ARM_MATH_CM7, ARM_MATH_CM4, ARM_MATH_CM3, ARM_MATH_CM0PLUS, ARM_MATH_CM0, ARM_M

    2024年02月12日
    浏览(37)
  • 【STM32】STM32学习笔记-GPIO相关API概述(06-1)

    文件: stm32f10x_gpio.h和stm32f10x_gpio.c 参考实现 参考: 【STM32】江科大STM32学习笔记汇总

    2024年04月29日
    浏览(36)
  • STM32芯片连接电脑出现的问题与解决方法

    我用的是正点原子STM32F1系列芯片,在用FLYMCU烧录程序时出现不少问题,下面是我列举的问题和解决方法。 1.FLYMCU参数设置 ①DTR低电平复位,RTS高电平进BootLoader ②勾选:校验、编程后执行、编程后重装文件 ③波特率:F1系列芯片可设置为115200 2.FLYMCU连接不上芯片,显示连接超

    2024年04月23日
    浏览(44)
  • STM32 出现SWD/JTAG Communication Failure

    本来想做13届国赛题,结果遇到了第一次碰到的问题,从昨天晚上到现在,问了客服,找人帮忙,,,最后终于解决了,虽然问题不难,但是刚开始学遇到这种问题还是挺要命的。 出现SWD/JTAG Communication Failure这个问题的原因就是你板子的SW被复用了,SW被复用的原因就是你配置

    2024年02月12日
    浏览(44)
  • STM32调试特定函数出现Cannot access Memory

    超出数组索引 指针访问越界 对空指针进行操作 都容易出现这个问题 如果是函数没有跑, 就出现Cannot access Memory 搜索到的结果大多是这种回复 可以参考一下

    2024年02月16日
    浏览(38)
  • 微信开发者工具出现警告:请注意游客模式下,调用 wx.operateWXData 是受限的, API 的返回是工具的模拟返回。

    问题出现背景: 第一次使用微信开发者工具时候控制台出现的警告。 原因: 微信开发者工具中创建项目时默认的AppID是参考示例,需要关联我们自己\\\"微信小程序\\\"的AppID。 解决方法: 登录\\\"微信公众平台\\\"——选择\\\"小程序\\\"——找到开发下面的开发管理——开发设置——开发者

    2024年02月12日
    浏览(66)
  • STM32 keil烧录出现program algorithm出错问题

    近期使用工程代码进行烧录的时候出现program algorithm问题, Cannot Load Flash Programming Algorithm 针对此问题的解决方案做个记录。 情景复现: 这里报错我们看到是 No Algorithm found for:08000000H - 08006647H 尝试解决: 这里初始烧录算法是没有的,需要我们进行手动添加,我使用的板子是

    2024年02月08日
    浏览(57)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包