嵌入式轻量级开源操作系统:HeliOS的使用

嵌入式轻量级开源操作系统:HeliOS的使用


  • 📍项目地址:https://github.com/heliosproj/HeliOS
  • HeliOS项目是一个社区交付的开源项目,用于构建和维护HeliOS嵌入式操作系统(OS)。HeliOS是一个功能齐全的操作系统,旨在满足由爱好者、研究人员、STEM教育工作者和学者组成的广泛用户社区的需求。HeliOS还旨在满足各种技能水平用户的需求,从在其Arduino项目中实施操作系统的电子爱好者,以及到开发将部署到现场的遥感仪器的研究科学家。
  • 🎉当前该系统支持的开发环境或平台:Arduino IDEPlatformIO IDEARM Cortex-M

✨请注意,当使用ESP32 Arduino内核时,Espressif ESP32微控制器上不支持HeliOS。这是因为ESP32 Arduino内核是基于FreeRTOS构建的,HeliOSFreeRTOS不能在同一个应用程序中共存。要针对ESP32,HeliOS必须使用Espressif的SDK构建,而不是使用ESP32 Arduino内核。 /src/port.h/src/port.c的文件也需要更新必要的代码来控制中断和访问微控制器的滴答计时器。

  • 对于微控制器的MMU或MPU(内存保护单元)启用时,可能无法从用户代码中访问内存映射寄存器和I/O。
  • 📜 HeliOS API文档说明: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

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

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

相关文章

黑马Java面试教程_P9_JVM虚拟机

系列博客目录 文章目录 系列博客目录前言1. JVM组成1.1 JVM由那些部分组成&#xff0c;运行流程是什么&#xff1f;3 41.2 什么是程序计数器&#xff1f;3 4总结 1.3 你能给我详细的介绍Java堆吗? 3 4总结 1.4 什么是虚拟机栈 3 4总结 1.6 能不能解释一下方法区&#xff1f; 3…

YOLO11改进-注意力-引入多尺度卷积注意力模块MSCAM

如何在增强特征图的同时降低计算成本&#xff0c;以提升模型性能。基于此&#xff0c;MSCAM 模块采用了多尺度卷积注意力机制&#xff0c;通过 CAB、SAB 和 MSCB 三个子模块协同工作。CAB 利用自适应池化和卷积操作生成通道注意力权重&#xff0c;强调重要通道特征&#xff1b;…

Kafka无锁设计

前言 在分布式消息队列系统中,Kafka 的无锁设计是其高吞吐量和高并发的核心优势之一。通过避免锁的竞争,Kafka 能够在高并发和大规模的生产环境中保持高效的性能。为了更好地理解 Kafka 的无锁设计,我们首先对比传统的队列模型,然后探讨 Kafka 如何通过无锁机制优化生产者…

Refusal in Language Models Is Mediated by a Single Direction

开源代码&#xff1a;https://github.com/andyrdt/refusal_direction Abstract 会话型大语言模型针对指令遵循和安全性进行了微调&#xff0c;从而产生服从良性请求但拒绝有害请求的模型。虽然这种拒绝行为在聊天模型中普遍存在&#xff0c;但其背后的机制仍然知之甚少。在这…

智慧平台数据可视化解决方案(附实践资料下载)

阿里云详解数据可视化大屏构建&#xff0c;内容涉及数据可视化大屏的构建。以下是该文件的核心内容概要&#xff1a; 数据可视化大屏概述&#xff1a; 数据可视化大屏的定义和目的。大屏在企业决策中的作用。 大屏设计原则&#xff1a; 强调用户体验和视觉美感。信息的清晰度和…

基于openlayers 开发vue地图组件

先看效果 主要功能如下&#xff1a; 测量图源更换放大缩小地图添加点hover点数据切换到地图位置&#xff1b;也设定层级2D3D切换&#xff0c;3D为cesium开发&#xff0c;技术交流可以加V&#xff1a;bloxed 地图工具做了插槽&#xff0c;分为toolbar&#xff08;左上角工具…

大模型(LLM)提示工程(Prompt Engineering)初识

大模型提示工程&#xff08;Prompt Engineering&#xff09;是指设计和优化给定任务的输入提示&#xff0c;以便从大型语言模型&#xff08;如GPT-4、GPT-3等&#xff09;中获得最佳输出。其核心目标是通过合理设计输入内容&#xff08;提示词或提示结构&#xff09;&#xff0…

人工智能ACA(六)--计算机视觉基础

一、计算机视觉概述 1. 计算机视觉定义 人工智能&#xff08;AI&#xff09;的一个重要分支旨在使计算机和系统能够从图像或多维数据中“理解”和“解释”视觉世界通过模拟人类视觉系统&#xff0c;计算机视觉技术能够自动执行诸如识别、分类、检测和跟踪等任务。 2. 计算机…

叉车作业如何确认安全距离——UWB测距防撞系统的应用

叉车在工业环境中运行&#xff0c;常常需要在狭窄的空间内完成货物的搬运和堆垛&#xff0c;这对操作员的技术水平和安全意识提出了极高的要求。传统的叉车作业依赖操作员的经验和视觉判断来确认安全距离&#xff0c;然而这种方式往往存在误差&#xff0c;特别是在视线受阻或光…

基于深度学习(HyperLPR3框架)的中文车牌识别系统-搭建开发环境

本篇内容为搭建开发环境。包括&#xff1a;python开发环境&#xff0c;Qt/C开发环境&#xff0c;以及用到的各个库的安装和配置。 一、Python开发环境搭建与配置 1、下载并安装Anaconda 我没有用最新的版本&#xff0c;安装的是 Anaconda3-2021.05-Windows-x86_64.exe&#…

神经网络-AlexNet

AlexNet是在2012年的ImageNet竞赛后&#xff0c;整理发表的文章&#xff0c;也是对CNN网络的衍生。 网络结构 AlexNet网络结构如下图所示&#xff0c;网络分为了上下两部分&#xff0c;对应两个不同的GPU训练&#xff0c;可以更好的利用GPU算力。只有在特殊的网络层后&#x…

【R语言遥感技术】“R+遥感”的水环境综合评价方法

R语言在遥感领域中是一个强大的工具&#xff0c;它提供了一系列的功能和优势&#xff0c;使得遥感数据的分析和应用更加高效和灵活。以下是R语言在遥感中的具体应用&#xff1a; 数据处理&#xff1a;R语言可以处理和清洗遥感数据&#xff0c;包括数据转换、滤波处理、去噪和数…

深入理解 ThinkPHP:框架结构与核心概念详解

深入理解 ThinkPHP&#xff1a;框架结构与核心概念详解 ThinkPHP 是一款广泛使用的 PHP 开发框架&#xff0c;以其高效性和灵活性受到开发者的青睐。要充分利用这一框架&#xff0c;理解其结构和核心概念是至关重要的。本文将详细解析 ThinkPHP 的框架结构及其重要概念&#x…

OceanBase之primary_one概念学习

OceanBase 集群通常有若干个zone组成&#xff0c;zone是(Availability Zone)的简写&#xff0c;代表一个可用区。zone本身是一逻辑概念&#xff0c;物理的zone可理解为一地理概念&#xff0c;对OceanBase来说&#xff0c;zone可以理解为副本的概念。 从物理层面看&#xff0c;…

硬件模块常使用的外部中断

对于STM32来说&#xff0c;想要获取的信号是外部驱动的很快的突发信号 例1&#xff1a;旋转编码器的输出信号&#xff1a; 可能很久都不会拧它&#xff0c;不需要STM32做任何事情但是一拧它&#xff0c;就会有很多脉冲波形需要STM32接收信号是突发的&#xff0c;STM32不知道什…

jupyter切换内核方法配置问题总结

下面这个博客总结了3种不同的方法&#xff0c;很有调理&#xff0c;推荐尝试 【最全指南】如何在 Jupyter Notebook 中切换/使用 conda 虚拟环境&#xff1f; !!! 注意使用上面介绍的ipykernel方法2, 要在每一个希望被jupyter识别到的环境内【分别】安装ipykernel以及添加配置 …

TCN-Transformer+LSTM多变量回归预测(Matlab)添加气泡图、散点密度图

TCN-TransformerLSTM多变量回归预测&#xff08;Matlab&#xff09;添加气泡图、散点密度图 目录 TCN-TransformerLSTM多变量回归预测&#xff08;Matlab&#xff09;添加气泡图、散点密度图预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基本介绍 1.双路创新&#xff…

基于AI IDE 打造快速化的游戏LUA脚本的生成系统

前面写了一篇关于使用AI IDE进行C安全开发的博客《使用AI IDE 助力 C 高性能安全开发&#xff01;》&#xff0c; 得到许多同学们的喜欢&#xff0c;今天我们来继续在游戏开发中扩展一下AI的能力&#xff0c;看看能不能给游戏研发团队一些启发。 在游戏研发中&#xff0c;Lua曾…

windows nacos安装配置

GitHub下载压缩包 解压目录&#xff08;注意不要用中文路径&#xff09; 在mysql先创建数据库nacos&#xff0c;再执行sql脚本 配置数据库 #*************** Config Module Related Configurations ***************# ### If use MySQL as datasource: ### Deprecated conf…

Redis 基本全局命令

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Redis 基本全局命令 收录于专栏[redis] 本专栏旨在分享学习Redis的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 KEYS EXISTS DEL…