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

CLion嵌入式基础开发——基于F570无人机(一)

引言

在上一次的文章中我们了解了如何进行CLion的项目环境配置,成功的实现了程序的基本构建。大部分单片机开发者早期都是使用Keil等软件进行程序开发的,包括我也是一样,从一款开发工具过度到另一款开发工具是一件很困难的事,这并不是因为新工具有多么的难用而是因为我们早已适应了去使用旧软件,一个人的开发习惯是很难去改变的,例如我们使用CLion进行文件的添加和删除时无法像之前使用Keil那样直接通过图形化界面进行添加,我们需要自己去编写对应的CMake语句,这不管是对于新手还是老手,都是极具挑战性的,但是不要灰心,因为你现在已经迈出了最难的第一步

在本次文章中我会介绍如何最大化发挥CLion作为现代IDE的优势,本期我们依旧会使用CLion去进行无人机项目的进一步开发,本次开发过程中我们会感受到CLion的魅力

实操

钩子函数简介

本次开发同样是基于上一次文档中的项目进行的,如果没看也没关系,自己创建一个新的项目也行,接下来我们直接进行项目的进一步开发。首先我们先在CubeMX中进行一下项目的配置,我们点开FreeRTOS中的Config parameters选项

我们本次需要关注的内容是Hook function related definitions的相关内容,这部分的选项大多都是FreeRTOS给开发者预留的接口函数,这些选项对于日常的报错排查和程序调试来说非常重要,这也是我们本次介绍的重点

空闲任务钩子函数
  • 触发时机:当系统中没有任何“就绪态”任务需要运行时,空闲任务便会被不断循环调用

  • 对应选项:USE_IDLE_HOOK

  • 关联函数:vApplicationIdleHook(void)

  • 典型用途:

    • 电源管理:在这里编写让 MCU 进入低功耗模式的代码。当有任务就绪被唤醒时,MCU 自动退出低功耗

    • 后台监控:执行一些优先级极低、不影响实时性的后台自检代码

  • 注意事项:不能在这个钩子函数中调用任何会导致阻塞的函数(如延时函数等),否则系统会彻底卡死

滴答定时器钩子函数

FreeRTOS中,滴答定时器是整个操作系统的心跳,复制驱动任务调度、软件定时器和延时等功能,通常情况下,它的频率是1001000hz(即每100ms或1ms产生一次中断)

这里需要辨析一个问题:FreeRTOS中的定时器和系统的硬件定时器的区别,这个问题可以在硬件定时器 VS 软件定时器文章中得到答案。滴答定时器钩子函数通常是由硬件的SysTick产生的,因此它的准确度很高。

  • 触发时机:每当系统发生一次滴答定时器的任务中断时该函数就会被调用一次

  • 对应选项:USE_TICK_HOOK

  • 关联函数:vApplicationTickHook(void)

  • 典型用途:需要极高时间精度的周期性极短操作

  • 注意事项:这个函数是在中断上下文中执行的。代码中不能出现任何的耗时操作

内存分配失败钩子函数
  • 触发时机:当代码中尝试使用pvPortMalloc()申请动态内存,但 FreeRTOS 的堆空间耗尽导致分配失败时被调用。

  • 对应选项:USE_MALLOC_FAILED_HOOK

  • 关联函数:vApplicationMallocFailedHook(void)

  • 典型用途:调试和异常捕获。通常在这里点亮一个红色的 Error LED或通过串口打印错误日志,以帮助开发者快速发现内存泄漏问题。

栈溢出检查钩子函数
  • 触发时机:发生任务栈溢出时调用。

  • 对应选项:CHECK_FOR_STACK_OVERFLOW

  • 关联函数:vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName)

  • 选项含义:

    • Disabled: 不检查。

    • Option 1: 调度器切换上下文时,检查任务栈指针是否超过了栈边界。速度快,但可能漏报(如果在切换前溢出又恢复了指针)。

    • Option 2: 在创建任务时用已知标记填充栈。检查栈底部的这些标记是否被覆盖。速度稍慢,但可靠性高。

  • 典型用途:捕获导致系统报错的原因。函数参数会直接告诉你是哪个任务发生了栈溢出,方便我们针对性地增加该任务的栈大小。

守护任务启动钩子函数
  • 触发时机:仅在启用了软件定时器的前提下,当 RTOS 的定时器服务任务(守护任务)首次开始运行时,被调用一次。

  • 对应选项:USE_DAEMON_TASK_STARTUP_HOOK

  • 关联函数:vApplicationDaemonTaskStartupHook(void)

  • 典型用途:如果你的某些初始化代码(例如网络协议栈初始化、需要等待事件标志组的外设初始化)必须在 FreeRTOS 调度器启动之后才能安全执行,就可以将这些代码放在这里,而不是放在main()循环中的osKernelStart()之前。

开启钩子函数

我们了解了钩子函数之后就可以在CubeMX中开启钩子函数,开启方式也非常简答,点击一下对应选项右边的状态栏即可进行状态的切换

我们将对应的函数状态都切换成Enable即可。生成代码之后我们就可以在CLion中的freertos.c文件中看到对应的操作函数

上面图片中红色方框内的是对应的函数原型,下面的是对应的函数实现,默认情况下这些函数内部是什么都代码没有的,有的只是官方的介绍注释,作为开发者我们可以在其中自由的编写对应的业务逻辑代码

重写printf函数

在之前进行裸机开发中我们经常会利用串口来输出调试信息,但我们不会直接使用HAL_UART_Transmit函数,因为这样操作调用的函数名太长,我们往往会重写printf函数的底层实现,即我们会在main.c中重写一下fputc函数。但是在CMake构建的项目中我们使用的编译器不同,在Keil环境中我们使用的是ARMCC编译器,在CMake中我们使用的是GCC编译器,由于编译器不同,所以printf函数的底层实现也不一样,在Keilprintf底层的实现依靠的是fputc函数,在GCC中底层的实现依靠的是__io_putchar函数。我们重写的函数内容如下:

#ifdef__GNUC__int__io_putchar(intch){//重写printf函数HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,HAL_MAX_DELAY);returnch;}#endif

这个函数可以放在main.c中,一般我们是把它放在下图所示的位置中

CMake里面我们可以配置对应的代码片段,这里我们可以将重写printf函数的这一部分代码保存到代码片段中,这样我们就能够在下次进行快速复用了

代码片段配置

CLIon中配置代码片段的操作如下:

  1. 按下键盘上的CTRL + ALT + S,这样能够快速打开设置界面

  2. 进入系统设置界面之后我们可以选择编辑器选项,然后在新界面中点击蓝色字体中的实时模板

  3. 在随后的界面中选择语言类型为C/C++

  4. 我们接下来点击新界面中的+号,随后我们就可以创建新的代码片段

  5. 随后我们就可以编辑代码片段中的内容,左边是代码体,右边是片段的相关参数

  6. 然后我们在写程序时就能够通过关键词来直接快速写出对应的代码了,比如本次我们配置的关键词就是input

总结

至此我们就走完了一段Clion的开发流程,在这个过程中我们或多或少的感受到了CLion作为现代化IDE的优势,下期内容我们会继续进行后续的开发流程

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

相关文章:

  • 青岛厂房办公楼装修一站式服务哪家好?一篇读懂其定义、价值与实现路径 - 汇聚至此
  • 2026年揭秘!余姚专业靠谱、备受称赞的雾化香水喷头公司究竟哪家强?
  • 2026年7月最新哈尔滨雷神笔记本售后网点完整指南(地址+客服电话+到店攻略) - 苹果手机电脑维修
  • 2026年无锡谷歌推广机构哪家好 多维度评测聚能信息 - 起跑123
  • 商丘黄金回收怎么选?7家靠谱门店实测,覆盖全市区县不踩坑! - 新芸鼎珠宝首饰
  • Python实现新安江三水源水文模型:从原理到工程实践
  • PC电源NTC热敏电阻故障诊断与继电器软启动改造实战
  • MCP与RAG对比解析:AI智能体如何高效连接外部数据
  • 3个秘诀:用SillyTavern打造有灵魂的AI角色,告别机械对话
  • MongoDB PBM 备份恢复完整验证手册
  • 从机理到实践告别“黑箱”模拟:OpenGeoSys(OGS6)多物理场THMC 全耦合建模与Python自动化分析
  • 2026年7月耐用的避雷针型号齐全推荐,钢管塔避雷针/镀锌角钢铁塔/电力架构/杆塔避雷塔,避雷针零售厂家价格 - 品牌推荐师
  • 微信公众号注册全流程详解:从类型选择到认证避坑指南
  • AI审计手记 #07 从“真假”到“意图”:AI视频审计的下一个范式(一个猜想)
  • WebGIS开发入门到进阶 | 高德地图打卡功能实现教程
  • 2026年北京GEO服务推荐:泛海明心靠谱选择 - GrowthUME
  • 数据编码与徽章生成技术:从Base64到动态徽章系统实战
  • 2026年GEO优化实战:AI搜索获客避坑与效果提升指南 - GrowthUME
  • 2026年长春正规医美机构梳理 奥克拉医疗美容等机构特色汇总 - 浩了个浩
  • Harris角点检测算法原理详解与Matlab完整实现
  • 2026.7安徽金思捷亲测,金蝶云苍穹集团适配
  • 2026考研备考效率工具横评:5款主流AI语音转写工具实测(网课笔记/专业课复盘场景)
  • 2026年7月最新成都雷神笔记本售后网点完整指南(地址+客服电话+到店攻略) - 苹果手机电脑维修
  • 如何快速定位手机号码归属地:3分钟掌握精准位置查询技巧
  • 柏盛家具|全屋定制工厂怎么甄别,实操技巧,多工厂横向对比 - 国麟测评
  • 2026石家庄代理记账新趋势,财务公司如何助企业降本增效? - GrowthUME
  • vulnhub靶场实战-Basic Pentesting:2
  • 智能驾驶芯片选型指南:从英伟达、高通到地平线的技术路线与工程实践
  • 《城市天际线2》街区建造教程:从道路规划到细节装饰的完整指南
  • 十堰家装公司怎么选?2026主流装企特点解析与装修避坑指南 - 国麟测评