目录

前言

一、主函数内容

二、osKernelInitialize ()内核初始化函数内容

三、IS_IRQ()宏定义中断检测函数内容

四、如果这篇文章能帮助到你,请点个赞鼓励一下吧ξ( ✿>◡❛)~

前言

        使用STM32CubeMX添加FreeRTOS进入工程之后,会自动在main函数中生成FreeRTOS的初始化和启动代码。

一、主函数内容

        main.c函数代码如下:

int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_I2C2_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Init scheduler */osKernelInitialize();		//FreeRTOS内核初始化/* Call init function for freertos objects (in cmsis_os2.c) */MX_FREERTOS_Init();		//FreeRTOS初始化/* Start scheduler */osKernelStart();			//FreeRTOS内核启动,任务调度算法/* We should never get here as control is now taken by the scheduler *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

二、osKernelInitialize ()内核初始化函数内容

         main函数中完成时钟和外设初始化之后,开始执行对FreeRTOS的初始化和启动流程,首先从osKernelInitialize ()内核初始化函数开始执行,osKernelInitialize ()函数代码如下所示:

osStatus_t osKernelInitialize (void) {osStatus_t stat;if (IS_IRQ())     //如果当前程序处于中断上下文中{stat = osErrorISR;	//stat状态寄存器变量赋异常值}else     //如果不在中断中{	if (KernelState == osKernelInactive) //如果内核状态标志位处于未激活状态{#if defined(USE_TRACE_EVENT_RECORDER)	//如果开启事件轨迹记录标志位EvrFreeRTOSSetup(0U);    //触发FreeRTOS初始化开始事件,0表示初始阶段,用于性能分析#endif//如果定义了使用HEAP_5规则来进行堆栈内存分配#if defined(USE_FreeRTOS_HEAP_5) && (HEAP_5_REGION_SETUP == 1)	vPortDefineHeapRegions (configHEAP_5_REGIONS);	//初始化堆内存区域#endifKernelState = osKernelReady;	//内核状态切换为就绪状态stat = osOK;	//函数状态返回值切换为OK} else {	//如果内核状态不处于未激活状态stat = osError;	//函数状态返回值赋值为osError}}return (stat);	//返回值
}

        这个FreeRTOS内核初始化函数的主要作用,就是在保障安全的情况下(检查当前程序是否处于中断上下文中),将FreeRTOS与运行状态标志位KernelState由osKernelInactive未激活状态切换为osKernelReady就绪状态。为什么不能在中断中进行处理呢?因为在中断中有可能会发生中断嵌套,如果两个中断都操作了同一寄存器,可能会引起同一变量的竞争,造成异常现象。

三、IS_IRQ()宏定义中断检测函数内容

         其中,IS_IRQ()是宏定义的中断检测函数入口,其引用的函数原型是 __get_IPSR(void),这个函数将32位的变量映射到ARM的IPSR寄存器,IPSR寄存器内部存储当前中断号或代码异常标志,若其返回值不为0,表示当前程序正处在中断函数中。

#define IS_IRQ_MODE()             (__get_IPSR() != 0U)
#define IS_IRQ()                  IS_IRQ_MODE()/**\brief   Get IPSR Register\details Returns the content of the IPSR Register.\return               IPSR Register value*/
__STATIC_INLINE uint32_t __get_IPSR(void)	//获取IPSR寄存器的数值
{//register是C语言中的关键字,功能是建议将变量存储在寄存器而非内存中//__asm是汇编语言的关键字,将register映射到ipsr寄存器,这是编译器的扩展语法,强制将变量__regIPSR与ARM的ipsr特殊寄存器绑定register uint32_t __regIPSR          __ASM("ipsr");	return(__regIPSR);	//返回寄存器的值
}

四、如果这篇文章能帮助到你,请点个赞鼓励一下吧ξ( ✿>◡❛)~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/88483.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88483.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/88483.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker—— 镜像构建原因

在现代软件开发和运维中,Docker已成为一种非常流行的工具,它通过容器化应用程序来简化部署过程。然而,默认的官方镜像往往只能满足基础需求,无法涵盖所有特定项目的具体要求。原因说明系统级改动无法通过 volume 实现修改用户、删…

锂电池自动化生产线的现状与发展

锂电池自动化生产线的概述锂电池自动化生产线是指采用自动化设备和控制系统,实现锂电池从原材料到成品的全流程自动化生产过程。随着新能源产业的快速发展,锂电池作为重要的储能元件,其生产制造技术也在不断进步。自动化生产线通过减少人工干…

java底层的native和沙箱安全机制

沙箱安全机制沙箱(Sandbox)安全机制是一种将程序或代码运行在隔离环境中的安全技术,旨在限制其对系统资源(如文件系统、网络、内存、其他进程等)的访问权限,从而降低潜在恶意代码带来的风险。其核心思想是“…

【分享】文件摆渡系统适配医疗场景:安全与效率兼得

根据国家信息安全相关法规要求,医院为了网络安全,大多会采用网闸等隔离手段,将网络隔离为内网和外网,但网络隔离后,医院的内外网间仍存在较为频繁的文件摆渡需求。文件摆渡系统则是可以解决跨网络或跨安全域文件传输中…

vscode 中的 mermaid

一、安装软件 Mermaid preview Mermaid support 二、运行命令 创建.md 文件右键选择 ​Open Preview​(或按 CtrlShiftV) 三、流程图 注意: 要md 文件要保留 mermaid 1. #mermaid-svg-nchqbvlWePe5KCwJ {font-family:"trebuchet ms"…

微服务引擎 MSE 及云原生 API 网关 2025 年 6 月产品动态

点击此处,了解微服务引擎 MSE 产品详情。

【TCP/IP】7. IP 路由

7. IP 路由7. IP 路由概述7.1 直接传递与间接传递7.2 IP 路由核心机制7.3 路由表7.3.1 路由表的构成7.3.2 信宿地址采用网络地址的好处7.3.3 下一跳地址的优势7.3.4 特殊路由表项7.3.5 路由算法7.4 静态路由7.4.1 特点7.4.2 自治系统(AS)7.4.3 配置命令7…

xFile:高性能虚拟分布式加密存储系统——Go

xFile:高性能虚拟分布式加密存储系统 目录xFile:高性能虚拟分布式加密存储系统1 背景介绍2 设计初衷与目标3 项目简介4 系统架构5 核心优势1. 真正的分布式块存储2. 块级加密与压缩,安全高效3. 灵活的索引与元数据管理4. 多用户与权限体系5. …

时序数据库:高效处理时间序列数据的核心技术

时序数据库概述时序数据库(Time Series Database,TSDB)是一种专门为存储、处理和查询时间序列数据而优化的数据库系统。随着物联网、金融科技、工业互联网等领域的快速发展,时序数据呈现出爆炸式增长,传统的关系型数据…

面试官:你再问TCP三次握手,我就要报警了!

CP三次握手和四次挥手,是面试官最爱问的“开场白”之一 别看它基础,真要讲清楚细节,分分钟让你冷汗直流! 这玩意儿就跟程序员相亲一样: 表面上问的是“你老家哪的” 实际上是在试探你有没有房、有没有车、能不能落…

RuoYi+Uniapp(uni-ui)开发商城系统

如果你正在考虑用 RuoYi 和 UniApp(uni-ui)搭建一套商城系统,那这套组合确实值得好好研究。它整合了 RuoYi 的快速开发能力和 UniApp 的跨平台特性,在高效开发的同时还能兼顾多端适配的需求。下面从技术架构、功能模块、开发实践到…

面试150 二叉树的最大高度

思路 考虑从递归出发,联想递归三部曲:返回什么、传入的参数是什么、遍历的方式是什么。此题现在需要我们整个树,并且需要从根节点出发,因此我们选择先序遍历即可。另一张办法,则是选择通过队列实现层次遍历&#xff0c…

从零实现一个GPT 【React + Express】--- 【2】实现对话流和停止生成

摘要 这是本系列文章的第二篇,开始之前我们先回顾一下上一篇文章的内容: 从零实现一个GPT 【React Express】— 【1】初始化前后端项目,实现模型接入SSE 在这一篇中,我们主要创建了前端工程和后端工程,这里贴一下我…

SEQUENCE在RAC多实例开启CACHE的NEXTVAL数值乱序问题

问题说明 在多实例环境中可能会出现从Sequence所取出来的nextval是乱序的,比如第二次比第一次所取的数要小但这并不是我们所希望的。当程序逻辑Base on sequence.nextval数值所谓填充字段的大小来排序时,就会产生问题。 实际上就是由于多实例这一特性造成…

后台管理系统-权限管理

在后台管理系统当中,权限管理占着非常重要的位置,权限管理,顾名思义,就是用来管理用户登录后台的权限。 在权限管理中有三个重要的名词:账号,角色,权限 账号:通过账号进入平台&…

MySQL表的约束(5)

文章目录前言一、空属性二、默认值三、列描述四、zerofill五、主键六、自增长七、唯一键八、外键总结前言 真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据…

MyBatis:SQL与Java的智能桥梁

MyBatis:SQL 与 Java 的「智能翻译官」 —— 用 极简的方式 连接数据库和 Java 对象,告别 JDBC 的繁琐操作!核心定位:半自动化 ORM 框架对比项JDBC 原生操作MyBatis 解决方案SQL 编写拼字符串(易出错、难维护&#xff…

自动驾驶控制系统

目录 控制系统概述 无人车控制架构设计 自动驾驶控制核心技术 车辆纵向控制 车辆横向控制 自动驾驶控制方法 自动驾驶控制技术方案 人机交互系统 控制系统概述 控制技术是智能驾驶的关键,旨在环境感知技术的基础之上,根据决策规划出目标轨迹,通过纵向和横向控制系统…

网络安全基石:从弱口令治理到动态防御体系的构建

引言:数字时代的防御困局 在5G与物联网技术全面落地的数字新基建时代,企业网络资产规模呈现指数级增长。Verizon《2023年数据泄露调查报告》显示,61%的安全事件直接源于凭证失窃,而其中81%的攻击成功案例可溯源至初始口令强度的不…

Error: fatal: detected dubious ownership in repository at

这个错误是 Git 在新版中引入的一种 安全检查机制,目的是防止不同用户访问同一个 Git 仓库目录,避免潜在的权限或安全问题。你的情况是:仓库目录是属于另一个用户。当前以管理员用户 OVERSPREAD/Administrator 运行 Git。Git 为了安全起见&am…