嵌入式轻量级开源操作系统:HeliOS的使用
嵌入式轻量级开源操作系统:HeliOS的使用
- 📍项目地址:
https://github.com/heliosproj/HeliOS
- HeliOS项目是一个社区交付的开源项目,用于构建和维护HeliOS嵌入式操作系统(OS)。HeliOS是一个功能齐全的操作系统,旨在满足由爱好者、研究人员、STEM教育工作者和学者组成的广泛用户社区的需求。HeliOS还旨在满足各种技能水平用户的需求,从在其Arduino项目中实施操作系统的电子爱好者,以及到开发将部署到现场的遥感仪器的研究科学家。
- 🎉当前该系统支持的开发环境或平台:
Arduino IDE、PlatformIO IDE、ARM Cortex-M。
✨请注意,当使用ESP32 Arduino内核时,Espressif ESP32微控制器上不支持
HeliOS。这是因为ESP32 Arduino内核是基于FreeRTOS构建的,HeliOS和FreeRTOS不能在同一个应用程序中共存。要针对ESP32,HeliOS必须使用Espressif的SDK构建,而不是使用ESP32 Arduino内核。/src/port.h和/src/port.c的文件也需要更新必要的代码来控制中断和访问微控制器的滴答计时器。
- 对于微控制器的MMU或MPU(内存保护单元)启用时,可能无法从用户代码中访问内存映射寄存器和I/O。
- 📜
HeliOSAPI文档说明:https://github.com/heliosproj/HeliOS/blob/master/doc/HeliOS_Developers_Guide.pdf -
🔖本文主要测试
Arduino IDE平台的使用和用Keil MDK以ARM Cortex-MMCU移植HeliOS的使用。
📘Arduino IDE平台构建和测试
- 🔧安装依赖库
HeliOS

- 📑库所提供的相关测试例程:

- 📝测试例程代码一:
一个基础的点灯程序。
/*UNCRUSTIFY-OFF*/
/*** @file Blink.ino* @author Manny Peterson <manny@heliosproj.org>* @brief An example Arduino sketch* @version 0.4.1* @date 2023-03-19* * @copyright* HeliOS Embedded Operating System Copyright (C) 2020-2023 HeliOS Project <license@heliosproj.org>* * SPDX-License-Identifier: GPL-2.0-or-later* * */
/*UNCRUSTIFY-ON*/
#include <Arduino.h>
#include <HeliOS.h>void blinkTask_main(xTask task_, xTaskParm parm_) {int ledState = DEREF_TASKPARM(int, parm_);if(ledState) {digitalWrite(LED_BUILTIN, HIGH);Serial.println("LED colosed");ledState = 0;} else {digitalWrite(LED_BUILTIN, LOW);Serial.println("LED open");ledState = 1;}DEREF_TASKPARM(int, parm_) = ledState;return;
}void setup() {xTask blink;int ledState;Serial.begin(115200);pinMode(LED_BUILTIN, OUTPUT);//初始化系统if(ERROR(xSystemInit())) {xSystemHalt();//停止HeliOS}//创建一个任务:传入任务指针 task、任务名称 "PRINTTSK"、任务函数 taskPrint_main 和任务函数参数if(ERROR(xTaskCreate(&blink, (const xByte *) "BLINKTSK", blinkTask_main, &ledState))) {xSystemHalt();}//将任务置于“等待”状态。if(ERROR(xTaskWait(blink))) {xSystemHalt();}
//同步扫描来更改任务计时器的时间间隔周期。任务被调度执行的间隔时间if(ERROR(xTaskChangePeriod(blink, 1000))) {xSystemHalt();}//启动HeliOS调度程序if(ERROR(xTaskStartScheduler())) {xSystemHalt();}xSystemHalt();
}void loop() {}
- 🔖以上代码,上传到328PB上传测试结果:

- 📝测试例程代码二:
运行两个占用不同时间的任务函数
/*UNCRUSTIFY-OFF*/
/*** @file Coop.ino* @author Manny Peterson <manny@heliosproj.org>* @brief An example Arduino sketch* @version 0.4.1* @date 2023-03-19* * @copyright* HeliOS Embedded Operating System Copyright (C) 2020-2023 HeliOS Project <license@heliosproj.org>* * SPDX-License-Identifier: GPL-2.0-or-later* * */
/*UNCRUSTIFY-ON*/
#include <Arduino.h>
#include <HeliOS.h>void taskShort_main(xTask task_, xTaskParm parm_) {/* Arduino's delay() is only used here to demonstrate HeliOS functionality and* must not be used in a real application built on HeliOS. */delay(500);Serial.print("S");digitalWrite(LED_BUILTIN, LOW);
}void taskLong_main(xTask task_, xTaskParm parm_) {/* Arduino's delay() is only used here to demonstrate HeliOS functionality and* must not be used in a real application built on HeliOS. */delay(1000);Serial.println("L");digitalWrite(LED_BUILTIN, HIGH);
}void setup() {xTask shortTask;xTask longTask;Serial.begin(9600);pinMode(LED_BUILTIN, OUTPUT);if(ERROR(xSystemInit())) {xSystemHalt();}if(ERROR(xTaskCreate(&shortTask, (const xByte *) "SHORTTSK", taskShort_main, null))) {xSystemHalt();}if(ERROR(xTaskCreate(&longTask, (const xByte *) "LONGTSK ", taskLong_main, null))) {xSystemHalt();}if(ERROR(xTaskResume(shortTask))) {xSystemHalt();}if(ERROR(xTaskResume(longTask))) {xSystemHalt();}if(ERROR(xTaskStartScheduler())) {xSystemHalt();}xSystemHalt();
}void loop() {}
- 📝测试例程代码三:
查询系统和任务信息
/*UNCRUSTIFY-OFF*/
/*** @file GetInfo.ino* @author Manny Peterson <manny@heliosproj.org>* @brief An example Arduino sketch* @version 0.4.1* @date 2023-03-19* * @copyright* HeliOS Embedded Operating System Copyright (C) 2020-2023 HeliOS Project <license@heliosproj.org>* * SPDX-License-Identifier: GPL-2.0-or-later* * */
/*UNCRUSTIFY-ON*/
#include <Arduino.h>
#include <HeliOS.h>void taskPrint_main(xTask task_, xTaskParm parm_) {String str;xTaskInfo tinfo;xSystemInfo sinfo;//用于获取关于单个任务的信息。提供了任务的状态和名称以及任务的运行时统计信息。if(OK(xTaskGetTaskInfo(task_, &tinfo))) {str = "taskPrint_main(): id = ";str += tinfo->id;str += ", name = ";str += xByte2String(CONFIG_TASK_NAME_BYTES, tinfo->name);str += ", state = ";str += tinfo->state;str += ", ltime = ";str += tinfo->lastRunTime;str += ", ttime = ";str += tinfo->totalRunTime;Serial.println(str);digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));//释放堆内存if(ERROR(xMemFree(tinfo))) {xSystemHalt();}}//获取系统信息:名称、版本和任务的数量if(OK(xSystemGetSystemInfo(&sinfo))) {str = "taskPrint_main(): ";str += xByte2String(OS_PRODUCT_NAME_SIZE, sinfo->productName);str += " ";str += sinfo->majorVersion;str += ".";str += sinfo->minorVersion;str += ".";str += sinfo->patchVersion;str += " has ";str += sinfo->numberOfTasks;str += " task.";Serial.println(str);if(ERROR(xMemFree(sinfo))) {xSystemHalt();}}
}void setup() {xTask task;Serial.begin(9600);pinMode(LED_BUILTIN, OUTPUT);if(ERROR(xSystemInit())) {xSystemHalt();}if(ERROR(xTaskCreate(&task, (const xByte *) "PRINTTSK", taskPrint_main, null))) {xSystemHalt();}if(ERROR(xTaskWait(task))) {xSystemHalt();}if(ERROR(xTaskChangePeriod(task, 1000))) {xSystemHalt();}if(ERROR(xTaskStartScheduler())) {xSystemHalt();}xSystemHalt();
}void loop() {}

📗Keil MDK以 ARM Cortex-MMCU移植HeliOS的使用
- 🔖这里以常见的
stm32f103为例,基于STM32CubeMX生成必要的工程代码作为基础。来实现对HeliOS系统的移植使用。
📄STM32移植HeliOS使用步骤
- 🌿使用
STM32CubeMX创建工程。 - 🔧修改默认时基:由于
HeliOS需要使用到滴答定时器作为时基,所以这里换成一个没有使用到的基本定时器。

- 🔨
NVIC修改,取消默认滴答定时器中断回调代码生成的勾选:由于HeliOS原驱动代码中已经包含相关代码。

- 🔖其他的外设,可以按需配置即可。
📑移植部分
- 🌿将
HeliOS原项目下载下来,拷贝项目中src,文件夹到自己所创建的项目文件夹中。


- 🌿将源文件(.c)添加到工程中:

- 🌿将头文件(.h)路径添加到工程目录中:

- 🌿添加宏
CMSIS_ARCH_CORTEXM:

- 🔧修改头文件
port.h:
#elif defined(CMSIS_ARCH_CORTEXM)// #include "stm32f429xx.h"#include "stm32f1xx_hal.h"//mcu型号头文件#define DISABLE_INTERRUPTS() __disable_irq()#define ENABLE_INTERRUPTS() __enable_irq()// #define SYSTEM_CORE_CLOCK_FREQUENCY 0xF42400u /* 16000000u */#define SYSTEM_CORE_CLOCK_FREQUENCY 0x44AA200u /* 72000000u 修改主频*/#define SYSTEM_CORE_CLOCK_PRESCALER 0x3E8u /* 1000u 分频系数*/
- 📝
main.c,添加必要的HeliOS.h头文件,创建任务。
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "HeliOS.h"
/* USER CODE END Includes */
- 创建任务:
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void blinkTask_main(xTask task_, xTaskParm parm_) {int ledState = DEREF_TASKPARM(int, parm_);if(ledState) {HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);printf("LED colosed.\r\n");ledState = 0;} else {HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);printf("LED open.\r\n");ledState = 1;}DEREF_TASKPARM(int, parm_) = ledState;return;
}
/* USER CODE END 0 */
- main函数:
int main(void)
{/* USER CODE BEGIN 1 */xTask blink;GPIO_PinState ledState;/* 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_USART1_UART_Init();/* USER CODE BEGIN 2 */
if(ERROR(xSystemInit())) {xSystemHalt();}if(ERROR(xTaskCreate(&blink, (const xByte *) "BLINKTSK", blinkTask_main, &ledState))) {xSystemHalt();}if(ERROR(xTaskWait(blink))) {xSystemHalt();}if(ERROR(xTaskChangePeriod(blink, 1000))) {xSystemHalt();}if(ERROR(xTaskStartScheduler())) {xSystemHalt();}xSystemHalt();/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}
- 驱动代码效果和上面的Arduino代码差不多。

📚移植后的工程测试源码
通过网盘分享的文件:HeliOS_Temp.rar
链接: https://pan.baidu.com/s/1PTqbM2gSwFqDfamEW_w-tA?pwd=pmdm 提取码: pmdm
相关文章:
嵌入式轻量级开源操作系统:HeliOS的使用
嵌入式轻量级开源操作系统:HeliOS的使用 📍项目地址:https://github.com/heliosproj/HeliOS HeliOS项目是一个社区交付的开源项目,用于构建和维护HeliOS嵌入式操作系统(OS)。HeliOS是一个功能齐全的操作系统࿰…...
解决VMware的ubuntu22虚拟机没有网络
解决步骤 1.在 Windows 系统中,按 “WinR” 键,输入 “services.msc” 并回车,在服务列表中找到 “VMware DHCP Service” 和 “VMware NAT Service”,确保这两个服务已启动,若未启动则右键点击选择 “启动”…...
金属衬底介质片对平面波的反射-问题的解析求解和FEM求解
金属衬底介质片对平面波的反射-问题的解析求解和FEM求解 参考有限元从零单排系列4 代码参考了上面大佬文章提供的,但是部分计算系数错了,我改了下加了许多注释,便于大家理解。 书籍参考的电磁场有限元方法(金建铭),所用的公式都…...
2023 年 9 月青少年软编等考 C 语言四级真题解析
目录 T1. 酒鬼T2. 大盗T3. 核电站思路分析T4. 盒子与小球之二思路分析T1. 酒鬼 此题为 2021 年 3 月四级第一题原题,见 2021 年 3 月青少年软编等考 C 语言四级真题解析中的 T1。 T2. 大盗 此题为 2021 年 6 月四级第二题原题,见 2021 年 6 月青少年软编等考 C 语言四级真…...
C++的内存四区
文章目录 内存四区1.程序运行前1.1 代码区2.1 全局区2.2 示例 2.程序运行后1.1 栈区1.2 堆区 内存四区 1.程序运行前 在程序编译后,生成了exe可执行程序,未执行该程序前分为两个区域。该区域的数据在程序结束后由操作系统释放. 1.1 代码区 存放 CPU …...
Java爬虫技术:按关键字搜索VIP商品详情
在数字化时代,电子商务平台的竞争日益激烈,而精准的数据采集和分析成为了企业获取竞争优势的关键。对于电商平台而言,能够根据用户输入的关键字快速搜索并展示VIP商品的详细信息,不仅能够提升用户体验,还能够增加销售机…...
C++ —— 模板类与函数
C —— 模板类与函数 模板类可以用于函数的参数和返回值,有三种形式: 普通函数,参数和返回值是模板类的实例化版本。函数模板,参数和返回值是某种的模板类。函数模板,参数和返回值是任意类型(支持普通类和…...
【软考高级】系统架构设计师复习笔记-精华版
文章目录 前言0 系统架构设计师0.1 考架构还是考系分0.2 架构核心知识0.3 架构教材变化 1 计算机操作系统1.1 cpu 组成1.2 内核的五大功能1.3 流水线技术1.4 段页式存储1.5 I/O 软件1.6 文件管理1.7 系统工程相关 2 嵌入式2.1 嵌入式技术2.2 板级支持包(BSP…...
免费 IP 归属地接口
免费GEOIP,查询IP信息,支持IPV4 IPV6 ,包含国家地理位置,维度,asm,邮编 等,例如 例如查询1.1.1.1 http://geoip.91hu.top/?ip1.1.1.1 返回json 对象...
AIA - IMSIC之二(附IMSIC处理流程图)
本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。 1 通过IMSIC接收外部中断的CSR 软件通过《AIA - 新增的CSR》描述的CSR来访问IMSIC。 machine level 的 CSR 与 IMSIC 的 machine level interrupt file 可相互互动;而 supervisor level 的 CSR…...
数据处理之数据规约
数据处理之数据规约 1. 数据规约概述 数据规约是数据处理中的重要方法,旨在让数据处理更简便、高效,以满足业务需求。当从数据仓库获取的数据量庞大时,直接在海量数据上进行分析和挖掘成本颇高。数据规约可得到数据集的归约表示,…...
爬虫代理服务要怎么挑选?
在数据采集的世界里,爬虫代理服务不仅帮助我们高效地收集信息,还能在保护数据安全方面发挥重要作用。但面对市场上琳琅满目的代理服务,我们该如何挑选呢?本文将为你提供一些实用的建议,帮助你找到最适合你的爬虫代理服…...
vue3组件调用解决奇怪问题的详细记录
左边是父组件,右边是子组件,运行正常: 父组件中的子组件加上class属性,运行报错:Extraneous non-props attributes (class) were passed to component but could not be automatically inherited because component re…...
【物联网技术与应用】实验16:模拟霍尔传感器实验
实验16 模拟霍尔传感器实验 【实验介绍】 基于霍尔效应,霍尔传感器是响应于磁场而改变其输出电压的传感器。霍尔传感器用于接近开关,定位,速度检测和电流检测应用。 霍尔传感器可以分为模拟霍尔传感器和开关霍尔传感器由电压调节器&#x…...
【机器学习案列】车牌自动识别系统:基于YOLO11的高效实现
🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...
高精度问题
目录 算法实现基础 高精度加法AB 测试链接 源代码 代码重点 高精度减法A-B 测试链接 源代码 代码重点 高精度乘法A*b和A*B 测试链接 源代码 代码重点 高精度除法A/b和A/B 测试链接 源代码 代码重点 高精度求和差积商余 算法实现基础 本算法调用STL…...
kong网关使用pre-function插件,改写接口的返回数据
一、背景 kong作为api网关,除了反向代理后端服务外,还可对接口进行预处理。 比如本文提及的一个小功能,根据http header某个字段的值,等于多少的时候,返回一个固定的报文。 使用到的kong插件是pre-function。 除了上…...
【QT开发自制小工具】PDF/图片转excel---调用百度OCR API接口
前言 前几年WPS还可以免费处理5页以内的PDF转excel,现在必须付费了,而且百度其他在线的PDF转excel都是要收费的,刚好前几年调研过百度OCR的高精度含位置接口,依然是每天可以免费调用50次,本篇是基于此接口,…...
vue2 elementui if导致的rules判断失效
优化目标 和 目标转化出价必填的 切换的时候还会隐藏掉 这时候的if语句会导致rules判断失效 我的办法是把判断拉到外面 别放在el-form-item里 <section v-if"unitForm.baseTarget OCPM && unitForm.cpaTargetOptions ! undefined && unitForm.cpaTa…...
DevOps实战:用Kubernetes和Argo打造自动化CI/CD流程(2)
DevOps实战:用Kubernetes和Argo打造自动化CI/CD流程(2) 背景 架构图 正片开始之前,请一定先熟悉上面的架构图,跟着我的步骤,一步一步执行成功,相信后续根据自己特定的需求定制CI/CD。 需求 …...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
