复习时间:貌似很遥远呀!(未定期)

基于小熊派的鸿蒙开发内核篇

  • 一、CMSIS-RTOS2接口
  • 二、HarmonyOS内核开发—任务管理
  • 三、HarmonyOS内核开发—定时器管理
    • 定时器基本概念
    • 定时器运行机制
    • 定时器创建实现
    • 实验拓展
  • 四、HarmonyOS内核开发—信号量
    • 信号量基本概念
    • 信号量运行机制
    • 信号量功能实现
    • 实验拓展
  • 五、HarmonyOS内核开发—事件管理
    • 事件管理基本概念
    • 事件管理运行机制
    • 事件管理功能实现
    • 实验拓展
  • 六、HarmonyOS内核开发—互斥锁
    • 互斥锁基本概念
    • 互斥锁运行机制
    • 互斥锁功能实现
    • 拓验拓展
  • 七、HarmonyOS内核开发—消息队列
    • 1、消息队列基本概念
    • 2、消息队列运行机制
    • 3、消息队列功能实现
    • 4、实验拓展

一、CMSIS-RTOS2接口

Cortex微控制器软件接口标准,Cortex-M系列的RTOS接口,为需要RTOS的软件组件提供了标准化API访问内核或外设。更多API参考:
https://arm-software.github.io/CMSIS_5/RTOS2/html/index.html

二、HarmonyOS内核开发—任务管理

三、HarmonyOS内核开发—定时器管理

定时器基本概念

是基于系统Tick时钟中断且由软件来模拟的定时器,当经过设定的Tick时钟计数值后会触发用户定义的回调函数。定时精度与系统Tick时钟的周期有关。

定时器运行机制

使用系统队列(FIFO)和任务资源,定时时间短优先被触发。

定时器创建实现

创建定时器:osTimerNew (osTimerFunc_t func, osTimerType_t type, void *argument, const osTimerAttr_t *attr);
启动定时器:osTimerStart (osTimerId_t timer_id, uint32_t ticks);
停止定时器:osTimerStop (osTimerId_t timer_id);
删除定时器:osTimerDelete (osTimerId_t timer_id);

实验拓展

exec1 = 1U;
id1 = osTimerNew(Timer1_Callback, osTimerOnce, &exec1, NULL);
if (id1 != NULL)
{// Hi3861 1U=10ms,100U=1StimerDelay = 100U; //T1延时1sstatus = osTimerStart(id1, timerDelay);if (status != osOK) {// Timer could not be started}
}osDelay(50U);  //系统延时0.5s
status = osTimerStop(id1); //停止T1
if(status != osOK) {printf("stop Timer1 failed\r\n");    /*停止失败(单次定时器未在延时时间内停止):假设我在2s的时候去停止而T1只延时了1s,其实已经停止了,这时再去停止就会停止失败*/
}
else
{printf("stop Timer1 success\r\n");   //停止成功(0.5s停止会成功)//单词定时器得在其运行期间去停止
}
status = osTimerStart(id1, timerDelay);
if (status != osOK) {printf("start Timer1 failed\r\n");
}
osDelay(200U);  //系统延时2s
status = osTimerDelete(id1);   //删除T1,定时器运行期间前后都能停止
if(status != osOK) {printf("delete Timer1 failed\r\n");  //删除失败
}
else
{printf("delete Timer1 success\r\n"); //删除成功
}

四、HarmonyOS内核开发—信号量

信号量基本概念

互斥
同步

信号量运行机制

初始化
创建
申请-1(0状态无法申请)
释放+1
删除

信号量功能实现

创建互斥锁:osSemaphoreNew (uint32_t max_count, uint32_t initial_count, const osSemaphoreAttr_t *attr);
获取互斥锁:osSemaphoreAcquire (osSemaphoreId_t semaphore_id, uint32_t timeout);
释放互斥锁:osSemaphoreRelease (osSemaphoreId_t semaphore_id);
删除互斥锁:osMutexDelete (osMutexId_t mutex_id);

实验拓展

实验没太明白,聪明的人可以通过拓展实验而做出另一个实用性实验,我还没达到那个能力,确实努力可以弥补一些这方面的能力,目前也只有努力这种方法了,多看看基础如51/32等,形成嵌入式方向思考的能力和举一反三(我没有举一反三的聪明天赋只能努力多看多学优秀的人的智慧结晶)的能力。

首先创建任务(osThreadNew)《P10-任务管理》设置优先级为同级
osSemaphoreNew (uint32_t max_count, uint32_t initial_count, const osSemaphoreAttr_t *attr);
sem1 = osSemaphoreNew(4, 0, NULL);

五、HarmonyOS内核开发—事件管理

事件管理基本概念

任务间通信的机制,可实现任务间的同步,事件可提供一对多、多对多的同步操作。

事件管理运行机制


a任务:事件2、3逻辑或(osFlagsWaitAny)
b任务:事件2、5逻辑与(osFlagsWaitAll)
事件2发生,a任务唤醒
事件5发生,b任务唤醒

事件管理功能实现

/***** 发送事件 *****/
void Thread_EventSender (void *argument)
{(void)argument;while (1) {    osEventFlagsSet(evt_id, FLAGS_MSK1);osThreadYield();                            // suspend threadosDelay(100);}
}/***** 接收事件 *****/
void Thread_EventReceiver (void *argument)
{(void)argument;uint32_t flags;while (1) {flags = osEventFlagsWait(evt_id, FLAGS_MSK1, osFlagsWaitAny, osWaitForever);printf("Receive Flags is %d\n",flags);}
}/***** 创建事件 *****/
static void Event_example (void)
{evt_id = osEventFlagsNew(NULL);if (evt_id == NULL) {printf("Falied to create EventFlags!\n");}osThreadAttr_t attr;attr.attr_bits = 0U;attr.cb_mem = NULL;attr.cb_size = 0U;attr.stack_mem = NULL;attr.stack_size = 1024*4;attr.priority = 25;attr.name = "Thread_EventSender";if (osThreadNew(Thread_EventSender, NULL, &attr) == NULL) {printf("Falied to create Thread_EventSender!\n");}attr.name = "Thread_EventReceiver";if (osThreadNew(Thread_EventReceiver, NULL, &attr) == NULL) {printf("Falied to create Thread_EventReceiver!\n");}
}

实验拓展

/***** 发送事件 *****/
void Thread_EventSender(void *argument)
{(void)argument;while (1){osEventFlagsSet(evt_id, FLAGS_MSK1);osEventFlagsSet(evt_id, FLAGS_MSK2);osEventFlagsSet(evt_id, FLAGS_MSK3);//suspend threadosThreadYield();osDelay(100);}
}/***** 接收事件 *****/
void Thread_EventReceiver(void *argument)
{(void)argument;uint32_t flags;while (1){flags = osEventFlagsWait(evt_id, FLAGS_MSK1|FLAGS_MSK2|FLAGS_MSK3, osFlagsWaitAll, osWaitForever);//多个事件对应一个任务printf("Receive Flags is %d\n", flags);}
}

六、HarmonyOS内核开发—互斥锁

互斥锁在操作系统中用于资源管理。微控制器中许多资源可以重复使用,但每次只能被一个线程使用(例如通信通道、内存和文件)。互斥锁用于保护对共享资源的访问。创建互斥锁,然后在线程之间传递(线程可以获取和释放互斥锁)。

互斥锁基本概念

互斥锁又称互斥型信号量,特殊的二值性信号量,对共享资源保护而实现独占式处理。
任务持有(闭锁)—任务释放(开锁)
可解决信号量存在的优先级翻转问题(优先级继承算法)。

互斥锁运行机制

互斥锁处理非共享资源的同步访问时,若有任务访问该资源,则互斥锁为加锁状态。其他任务访问会被阻塞,该锁任务释放,其他任务进行资源访问,再次上锁。如此确保同一时刻只有一个任务正在访问这个公共资源,保证了公共资源操作的完整性。

互斥锁功能实现

创建互斥锁:osMutexNew (const osMutexAttr_t *attr);
获取互斥锁:osMutexAcquire (osMutexId_t mutex_id, uint32_t timeout);
释放互斥锁:osMutexRelease (osMutexId_t mutex_id);
删除互斥锁:osMutexDelete (osMutexId_t mutex_id);

/***** 高优先级 *****/
void HighPrioThread(void)
{osDelay(100U); // wait 1s until start actual workwhile(1) {osMutexAcquire(mutex_id, osWaitForever); // try to acquire mutexprintf("HighPrioThread is runing.\r\n");osDelay(300U);osMutexRelease(mutex_id);}
}/***** 中优先级 *****/
void MidPrioThread(void)
{osDelay(100U); // wait 1s until start actual workwhile(1) {printf("MidPrioThread is runing.\r\n");osDelay(100);}
}/***** 低优先级 *****/
void LowPrioThread(void)
{while(1) {osMutexAcquire(mutex_id, osWaitForever); //申请printf("LowPrioThread is runing.\r\n");osDelay(300U); // block mutex for 5sosMutexRelease(mutex_id);  //释放}
}void Mutex_example(void)
{osThreadAttr_t attr;attr.attr_bits = 0U;attr.cb_mem = NULL;attr.cb_size = 0U;attr.stack_mem = NULL;attr.stack_size = 1024 * 4;attr.name = "HighPrioThread";attr.priority = 26;if (osThreadNew((osThreadFunc_t)HighPrioThread, NULL, &attr) == NULL){printf("Falied to create HighPrioThread!\n");}attr.name = "MidPrioThread";attr.priority = 25;if (osThreadNew((osThreadFunc_t)MidPrioThread, NULL, &attr) == NULL){printf("Falied to create MidPrioThread!\n");}attr.name = "LowPrioThread";attr.priority = 24;if (osThreadNew((osThreadFunc_t)LowPrioThread, NULL, &attr) == NULL){printf("Falied to create LowPrioThread!\n");}mutex_id = osMutexNew(NULL);if (mutex_id == NULL){printf("Falied to create Mutex!\n");}
}

问:为什么LOW首先获取申请互斥锁呢?
答:高/中优先级都osDelay(100U);可以复习下《任务管理》中的时间概念和《软件定时器》

拓验拓展

void HighPrioThread(void)
{// wait 1s until start actual workosDelay(100U);osStatus_t status;while (1){// try to acquire mutexstatus = osMutexAcquire(mutex_id, osWaitForever);  //申请互斥锁并返回一个状态值if(status != osOK) {printf("acquire mutex failed\r\n");//互斥锁申请失败}else{printf("acquire mutex success\r\n");//互斥锁申请成功}printf("HighPrioThread is runing.\r\n");osDelay(300U);status = osMutexRelease(mutex_id);//释放互斥锁if(status != osOK) {printf("release mutex failed\r\n");//互斥锁释放失败}else{printf("release mutex success\r\n");//互斥锁释放成功}}
}void LowPrioThread(void)
{osStatus_t status;while (1){status = osMutexAcquire(mutex_id, osWaitForever);printf("LowPrioThread is runing.\r\n");if(status != osOK) {printf("acquire mutex failed\r\n");}else{printf("acquire mutex success\r\n");}// block mutex for 3sosDelay(300U);status = osMutexRelease(mutex_id);if(status != osOK) {printf("release mutex failed\r\n");}else{printf("release mutex success\r\n");} }
}status = osMutexDelete(mutex_id);
//删除互斥锁并返回一个状态值
if(status != osOK) {printf("delete mutex failed\r\n");//删除互斥锁失败
}
else
{printf("delete mutex success\r\n");//删除互斥锁成功
}status = osMutexDelete(mutex_id);
//再次删除互斥锁并返回一个状态值,再次删除肯定失败,因为互斥锁已经不存在
if(status != osOK) {printf("delete mutex failed\r\n");//删除互斥锁失败
}
else
{printf("delete mutex success\r\n");//删除互斥锁成功
}

七、HarmonyOS内核开发—消息队列

1、消息队列基本概念

2、消息队列运行机制

3、消息队列功能实现

创建消息队列:osMutexNew (const osMutexAttr_t *attr);
发送消息:osMutexAcquire (osMutexId_t mutex_id, uint32_t timeout);
获取消息:osMutexRelease (osMutexId_t mutex_id);
删除消息队列:osMutexDelete (osMutexId_t mutex_id);

#include <stdio.h>
#include <string.h>
#include <unistd.h>#include "ohos_init.h"
#include "cmsis_os2.h"//number of Message Queue Objects
#define MSGQUEUE_OBJECTS 16typedef struct
{//object data typechar *Buf;  uint8_t Idx;
} MSGQUEUE_OBJ_t;MSGQUEUE_OBJ_t msg;//message queue id
osMessageQueueId_t mid_MsgQueue;   void Thread_MsgQueue1(void *argument)
{(void)argument;//do some work...msg.Buf = "Hello BearPi-HM_Nano!";msg.Idx = 0U;while (1){//消息队列ID、消息内容、优先级、超时时间(0表示立刻)//when timeout is 0, the function returns instantlyosMessageQueuePut(mid_MsgQueue, &msg, 0U, 0U);//suspend threadosThreadYield();osDelay(100);}
}void Thread_MsgQueue2(void *argument)
{(void)argument;osStatus_t status;while (1){//Insert thread code here...//wait for message//消息队列ID、消息内容、优先级、超时时间status = osMessageQueueGet(mid_MsgQueue, &msg, NULL, 0U);if (status == osOK){//msg为结构体类型printf("Message Queue Get msg:%s\n", msg.Buf);}}
}static void Message_example(void)
{//创建并初始化一个消息队列对象,返回值为消息队列IDmid_MsgQueue = osMessageQueueNew(MSGQUEUE_OBJECTS, 100, NULL);if (mid_MsgQueue == NULL){printf("Falied to create Message Queue!\n");}osThreadAttr_t attr;attr.attr_bits = 0U;attr.cb_mem = NULL;attr.cb_size = 0U;attr.stack_mem = NULL;attr.stack_size = 1024 * 10;attr.priority = 25;attr.name = "Thread_MsgQueue1";if (osThreadNew(Thread_MsgQueue1, NULL, &attr) == NULL){printf("Falied to create Thread_MsgQueue1!\n");}attr.name = "Thread_MsgQueue2";if (osThreadNew(Thread_MsgQueue2, NULL, &attr) == NULL){printf("Falied to create Thread_MsgQueue2!\n");}
}APP_FEATURE_INIT(Message_example);

4、实验拓展

num和count还不明白内部原理,虽能自圆其说,但感觉仍是一知半解。num是put和get才+1,而count是当前消息队列中的数量,对其内部全然不知(挖坑+1)

void Thread_MsgQueue1(void *argument)
{(void)argument;uint8_t num = 0;//do some work...msg.Buf = "Hello BearPi-HM_Nano!";while (1){msg.Idx = num;osMessageQueuePut(mid_MsgQueue, &msg, 0U, 0U);//消息队列内部计数(非阻塞态)num++;//suspend threadosThreadYield();osDelay(100);}
}void Thread_MsgQueue2(void *argument)
{(void)argument;osStatus_t status;uint32_t count;while (1){//Insert thread code here...//计数消息队列中的队列消息数量(包含阻塞量)count = osMessageQueueGetCount(mid_MsgQueue);printf("message queue get count: %d\r\n",count);if(count == MSGQUEUE_OBJECTS){//若满足最大消息队列数执行DeleteosMessageQueueDelete(mid_MsgQueue);}//wait for messagestatus = osMessageQueueGet(mid_MsgQueue, &msg, NULL, 0U);if (status == osOK) {printf("Message Queue Get msg idx:%d buf:%s\n", msg.Idx,msg.Buf);}osDelay(300);}
}

全文从下往上熟悉程度依次递减

基于小熊派的HarmonyOS鸿蒙开发教程——内核篇相关推荐

  1. 2021物联网开发学习——基于小熊派IoT开发板Bear-Pi-IOT、E53_IA1_智慧农业拓展板与小熊派-鸿蒙·季Bear-Pi-HM Nano并接入Hi-Link

    2021物联网开发学习--基于小熊派IoT开发板Bear-Pi-IOT.E53_IA1_智慧农业拓展板与小熊派-鸿蒙·季Bear-Pi-HM Nano并接入Hi-Link 目录 作者介绍 目的 用到的 ...

  2. 嵌入式开发——基于小熊派的智慧农业案例(二)

    本组设计的功能描述(含所有实现的模块的功能) 基于小熊派的智慧农业案例 实时监测环境中温湿度变化及光照变化 通过NB-IOT通信,将数据传至云端,实现云端实时检测. 通过控制电机和补光灯的启动条件,实 ...

  3. OpenHarmony HDF Input框架模块 按键控制LED基于小熊派micro

    文章目录 摘要 开发环境 KEY驱动程序 KeyConfigInstance: RegisterKeyDevice 中断处理函数 KeyIrqHandle RegisterInputDevice:注册 ...

  4. 3.5【HarmonyOS鸿蒙开发】组件RadioButton和RadioContainer

    3.5[HarmonyOS鸿蒙开发]组件RadioButton和RadioContainer 作者:韩茹 公司:程序咖(北京)科技有限公司 鸿蒙巴士专栏作家 一.RadioButton RadioBu ...

  5. 开源项目-基于小熊派STM32红外热成像仪

    点击上方"嵌入式应用研究院",选择"置顶/星标公众号" 干货福利,第一时间送达! 来源 | 嵌入式应用研究院 整理&排版 | 嵌入式应用研究院 中秋假期 ...

  6. 视频教程-基于python的微信公众号开发教程-微信开发

    基于python的微信公众号开发教程 微信企业号星级会员.10多年软件从业经历,国家级软件项目负责人,主要从事软件研发.软件企业员工技能培训.已经取得计算机技术与软件资格考试(软考)--"信 ...

  7. 微信小程序/uni-app 蓝牙打印开发教程和常见问题总结【文末附源码】

    微信小程序/uni-app 蓝牙打印开发教程和常见问题总结[文末附源码] 文章目录 微信小程序/uni-app 蓝牙打印开发教程和常见问题总结[文末附源码] 1️⃣ 写在前面 2️⃣ 蓝牙连接流程 3 ...

  8. 基于以太坊的智能合约开发教程Solidity modifier

    基于以太坊的智能合约开发教程Solidity modifier pragma solidity ^0.4.0;contract modifierTest{address owner;uint publ ...

  9. 微信小程序购物商城系统开发系列-工具篇

    微信小程序购物商城系统开发系列-工具篇 微信小程序开放公测以来,一夜之间在各种技术社区中就火起来啦.对于它 估计大家都不陌生了,对于它未来的价值就不再赘述,简单一句话:可以把小程序简单理解为一个新的操 ...

最新文章

  1. 在Ubuntu 14.04 64bit上安装CHM阅读器KchmViewer 5.3
  2. 阿里达摩院刷新纪录,开放域问答成绩比肩人类水平,超微软、Facebook
  3. 接手一个网站后应做什么
  4. (摘抄)HTTP 协议详解
  5. boost::safe_numerics模块测试对文字的 constexpr 操作
  6. java 固定电话正则_java针对电话号码正则匹配实例
  7. 特征值分解与奇异值分解的相关学习记录
  8. android studio资源二进制,无法自动检测ADB二进制文件 – Android Studio
  9. python经典程序实例-Python简单基础小程序的实例代码
  10. React antd 使用类式组件 对表单数据域进行控制 this.formRef.current.setFieldsValue
  11. JavaScript中document.getElementById和document.write
  12. 计算机科学与技术的主要研究方向,计算机科学与技术学科方向与特色
  13. python3根据图片链接下载图片
  14. teamviewer常用命令
  15. 浏览器使用flash时出现此Flash Player 与您所在地区不相容的提示解决方法
  16. 美国经济数据公布时间
  17. go-ipfs命令详解之files
  18. Ps|无规律渐变效果
  19. 2022年软考时间是怎么安排的,有哪些工种可以选择?如何备考?
  20. 办公小技巧:excel纸张大小设置

热门文章

  1. day02 邮箱测试用例/qq账号测试用例/城市电话号用例
  2. 小米的隔空充电,看起来好酷
  3. 建行U盾分类,制单盾、复核盾、主管盾。建行企业网银主管、复核、制单可以是一个人吗?
  4. 记一次用canvas做出腾讯云首页banner流光效果的经历
  5. Google重磅发布云游戏平台,彻底告别游戏主机时代
  6. Pr进阶:时间重映射与时间插值
  7. 这一次我不再低调,老板法拉利的车牌有我的汗水
  8. 金山云AI新突破:集智高清让带宽降下去让画质升上来
  9. 2016七夕奇葩礼物第一名,不服来辩!
  10. java如何调取别人接口_调别人的接口会,现在别人调我的接口。不知道怎么操作了...