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中滴答定时器是整个操作系统的心跳复制驱动任务调度、软件定时器和延时等功能通常情况下它的频率是100到1000hz即每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函数的底层实现也不一样在Keil中printf底层的实现依靠的是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中配置代码片段的操作如下按下键盘上的CTRL ALT S这样能够快速打开设置界面进入系统设置界面之后我们可以选择编辑器选项然后在新界面中点击蓝色字体中的实时模板在随后的界面中选择语言类型为C/C我们接下来点击新界面中的号随后我们就可以创建新的代码片段随后我们就可以编辑代码片段中的内容左边是代码体右边是片段的相关参数然后我们在写程序时就能够通过关键词来直接快速写出对应的代码了比如本次我们配置的关键词就是input总结至此我们就走完了一段Clion的开发流程在这个过程中我们或多或少的感受到了CLion作为现代化IDE的优势下期内容我们会继续进行后续的开发流程

相关新闻

局域网设备发现实战:从ARP缓存到Nmap扫描,快速定位IP、MAC与主机名

局域网设备发现实战:从ARP缓存到Nmap扫描,快速定位IP、MAC与主机名

1. 从一次“找不到设备”的排查说起 那天下午,同事急匆匆地跑过来,说新部署在会议室的一台网络打印机死活连不上,但隔壁工位的电脑却能正常打印。我们首先怀疑是IP冲突或者防火墙策略,但登录路由器管理界面一看,设备列…

2026/10/12 10:39:51 阅读更多 →
个人 AI 能力栈的建设路线:提示工程、Agent 编排与模型评估

个人 AI 能力栈的建设路线:提示工程、Agent 编排与模型评估

个人 AI 能力栈的建设路线:提示工程、Agent 编排与模型评估 一、深度引言与场景痛点:我会用 Copilot,但这就够了吗 7 月结束后,我梳理了自己的 AI 工具使用情况:Copilot 按 Tab 补全、ChatGPT 问问题、Claude 做深度…

2026/10/3 9:22:51 阅读更多 →
了解Mysql优化吗?如何优化索引?

了解Mysql优化吗?如何优化索引?

了解Mysql优化吗?如何优化索引? 为什么需要Mysql索引优化?大家好,我是你们的技术博主。今天我们来聊聊Mysql索引优化这个话题。相信很多开发者在做数据库开发时,都遇到过这样的场景:随着数据量的增长&#…

2026/10/3 7:54:21 阅读更多 →

最新新闻

业务驱动挖金融SRC:从逻辑漏洞到越权的高价值挖掘思路

业务驱动挖金融SRC:从逻辑漏洞到越权的高价值挖掘思路

做金融SRC这五六年,我最大的体会是:漏洞挖掘的瓶颈往往不在工具,而在你对业务的理解深度。同样一批人,手里工具差不多,漏洞库也差不多,但产出高价值漏洞的能力可以差出好几倍。通用扫描器擅长发现组件版本漏…

2026/10/14 21:39:33 阅读更多 →
MinGW-gcc-4.4实战:老编译器解决老代码编译兼容性难题

MinGW-gcc-4.4实战:老编译器解决老代码编译兼容性难题

简介:MinGW-gcc-4.4 是一套面向 Windows 平台的开源 GCC 编译工具链,旨在帮助开发者在脱离 Visual Studio 等商业软件的情况下,编译并构建 C/C 程序。该版本于 2010 年发布,对 C0x 标准提供了初步支持,涵盖 lambda 表达…

2026/10/14 21:39:33 阅读更多 →
SpringBoot+Vue+MyBatis+MySQL就业管理系统架构设计与部署全解析

SpringBoot+Vue+MyBatis+MySQL就业管理系统架构设计与部署全解析

“企业级”这个前缀,在我把源码完整跑通之前,一直当成营销词来对待。大学生就业需求分析系统管理,名字听着很唬人,拆开看就是一套典型的权限管理 信息档案 数据统计组合项目。真正让我觉得它值得写一篇东西的,是它在…

2026/10/14 21:39:33 阅读更多 →
社交媒体英语口语怎么学?从看懂评论区到轻松接梗的实战指南

社交媒体英语口语怎么学?从看懂评论区到轻松接梗的实战指南

教英语口语这些年,我见过不少挺反常的现象:一个学生四六级高分,刷了三年美剧,读英语新闻毫不费力,结果真到了海外社交平台上,看着评论区一下就懵了。一条普通到不能再普通的评论就能让他怀疑自己学的是不是…

2026/10/14 21:39:33 阅读更多 →
Spring Boot+Vue家乡旅游宣传系统全栈开发实战解析

Spring Boot+Vue家乡旅游宣传系统全栈开发实战解析

我一直认为,像“基于 Spring Boot Vue 的家乡特色旅游宣传系统”这类题目,是检验 Java 全栈能力很合适的练手项目。它逻辑不复杂,但涉及的技术点足够全:用户端展示、管理后台、数据库设计、文件上传、接口联调、服务器部署&#…

2026/10/14 21:39:33 阅读更多 →
AI辅助开发实战:用Python重做一个mini版Photoshop

AI辅助开发实战:用Python重做一个mini版Photoshop

最近技术社区和设计圈都在讨论一件事:Adobe 更新应用内许可条款后,不少开发者担心“用 AI 辅助开发软件”会撞上版权红线;随后 Adobe 官方人员在社区公开回应,表示不会对使用 AI 辅助开发的非商业开源替代品采取法律行动&#xff…

2026/10/14 21:38:32 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →