当前位置: 首页 > news >正文

FreeRtos学习中疑惑

1.滴答定时器如何和freertos联系起来?需要做什么配置?

联系:任务调度器开始后,有默认初始化滴答定时器(根据configCPU_CLOCK_HZ+configTICK_RATE_HZ配置),port函数有初始化函数和中断定时器(vPortSetupTimerInterrupt+xPortSysTickHandler)。

配置:只需要在freertosconfig函数增加中断映射宏定义+填写滴答定时器节拍次数。

#define configCPU_CLOCK_HZ SystemCoreClock /* 定义CPU主频, 单位: Hz, 无默认需定义 */
#define xPortSysTickHandler SysTick_Handler
#define configTICK_RATE_HZ 1000 /* 定义系统时钟节拍频率, 单位: Hz, 无默认需定义 */

2.现象:调试时,程序可能停在反汇编窗口的BKPT 0xABSWI指令上,卡在systemlnit都没进去。

这是ARM开发中非常常见的一个“坑”。当你使用了printf等标准I/O函数,但目标硬件上并没有连接调试器来响应这些函数的请求时,程序在启动阶段就会陷入死循环。

方法A(推荐):使用微库(Microlib)。在Options for TargetTarget选项卡中,勾选"Use MicroLIB"。MicroLIB是Keil提供的一个针对深度嵌入式应用的精简库,它默认关闭了半主机功能

3.led长脚长引脚为正极,短引脚为负极。

如果1为亮,0为灭。长脚接io口,短脚接—级。

4.记录一次因为按键按一次两次进入删除任务,并且删除任务后句柄未赋值为NULL,导致的死机

/* 删除任务时永远先检查再置NULL */ if(task1_handler != NULL) { vTaskDelete(task1_handler); task1_handler = NULL; }

5.如果在中断程序中调用freertos的中断API,如何配置NVIC优先级?

大多数系统的默认配置都是所需要的, STM32 驱动器库除外。如果使用的是带有 STM32 驱动程序库的 STM32 ,则在启动 RTOS 之前,通过 调用 NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 ),确保将所有优先级位分配为抢占式优先级位。

以 "FromISR" 结尾的 FreeRTOS 函数是中断安全的,但前提是 调用这些函数的中断的逻辑优先级不高于 configMAX_SYSCALL_INTERRUPT_PRIORITY 定义的优先级(configMAX_SYSCALL_INTERRUPT_PRIORITY 在 FreeRTOSConfig.h 头文件中定义)。 因此,对于任何使用一个 RTOS API 函数的中断服务程序, 必须为其手动设置为一个数值优先级,这个值必须等于或大于 configMAX_SYSCALL_INTERRUPT_PRIORITY 设定 的值。这确保了中断的逻辑优先级等于或小于 configMAX_SYSCALL_INTRUPT_PRIORITY 设置。

Cortex-M 中断的默认数值优先级为 0。0 是最高的 优先级。因此,切勿将使用中断安全 RTOS API 的中断的优先级设置为默认值

6.验证定时器时间是否设置准确。

中断函数中除了led翻转,不要加其它代码,print函数尤其占用时间,无法准确测量时间。计算时间公式。

F=SYSTME/(Prescaler + 1)/(Period +1)

T=1/F

7.portDISABLE_INTERRUPTS()之后运行阻塞函数 vTaskDelay(pdMS_TO_TICKS(500))会导致关中断失效。

vTaskDelay函数底层有开中断操作

8.printf函数

占用时间和波特率有关,115200会快。用逻辑分析仪看时间打在main函数,防止任务调度。

9.死延时

NOP函数,要用逻辑分析仪调一下准度

10.CUBMX

Application/User/Hardware 工程这样写,不会被CUBX删除

http://www.jsqmd.com/news/463471/

相关文章:

  • 电子游戏与人类“存续与复制”的近端机制
  • Makefile相关
  • 为什么选择科哥构建版?IndexTTS2定制镜像优势全面解析
  • C语言数据结构系列:链表详解与代码示例
  • 【2026 最新 !】分享一套优质的 SpringBoot+Vue 高校就业招聘系统的设计与实现(万字文档+源码+视频文档讲解)
  • 线程同步与互斥
  • webase部署智能合约失败报错:合约部署错误,请检查合约的构造函数入参或检查链状态...如何解决?
  • YOLO目标检测数据集大全【数据集+训练好的模型+训练检测教程】(持续更新)
  • 订单提现管理系统
  • 代码都没啥问题,Xuper超级链上创建合约时为什么solidity合约还是编译失败?
  • 对抗知网的 N-Gram 算法:基于语义解耦的【文本重构】与【事实性核验】架构设计
  • 纯VB6代码实现稳定多线程(源码下载,非ActiveX EXE)
  • 商城项目中用到的一些ubuntu系统指令
  • Ren‘Py给不同的角色安排不同的对话框
  • Agent开发学习
  • Crmeb.java项目理解(一)
  • HTB Tracks - REVERSE - SimpleEncryptor
  • Python中继承带来的问题
  • NFTMarket 1 | NFT 简介、业务、技术方案
  • 四字节十六进制转化为单精度IEEE 754 浮点数
  • 打开软件就弹出vccorlib120.dll如何修复? 附免费下载方法分享
  • Ray + LanceDB + Daft 构建大规模向量数据分析管道
  • 计算机软件资格考试——专业英语
  • 没有 Base Code 谈何重构?揭秘智能零零AI论文助手从 0 到 1 的大模型结构化生成引擎
  • 打开软件就弹出vcomp.dll如何修复? 附免费下载方法分享
  • macbookair安装openclaw
  • Ray 集群多用户资源隔离实践
  • MySQL 进阶:库与表的DDL核心操作全指南(含实战案例)
  • 工业 + AI 落地实践:JBoltAI在工业场景的应用解析
  • 打卡信奥刷题(2938)用C++实现信奥题 P5800 [SEERC 2019] Life Transfer