HarmonyOS内核开发—信号量开发案例学习记录
 
一、LiteOS里面的任务管理介绍:
任务状态通常分为以下四种:
就绪(Ready):该任务在就绪列表中,只等待CPU。
运行(Running):该任务正在执行。
阻塞(Blocked):该任务不在就绪列表中。包含任务被挂起、任务被延时、任务正在等待信号量、读写队列或者等待读写事件等。
退出态(Dead):该任务运行结束,等待系统回收资源。

案例 :cmsis_os2的API任务接口

创建任务:osThreadNew(osThreadFunc_t func,void * argument,const osThreadAttr_t * attr)
删除某个任务:osThreadTerminate(osThreadId_t thread_id);
任务挂起:osThreadSuspend(osThreadId_t thread_id)
任务恢复:osThreadResume (osThreadId_t thread_id)
#include <stdio.h>
#include <string.h>
#include <unistd.h> #include "ohos_init.h"
#include "cmsis_os2.h" osThreadId_t threadHiID;
osThreadId_t threadLoID; /*****任务一*****/
void threadHi(void)
{
// int sum = 0;
// while (1)
// {
// printf("This is BearPi Harmony Thread1----%d\r\n", sum++);
// usleep(1000000);
// }
printf("enter threadHi\r\n");
osDelay(1); //其作用是让任务阻塞
printf("threadHi delay done\r\n");
osThreadSuspend(threadHiID); //任务挂起
printf("threadHi osThreadResume success\r\n");
osThreadTerminate(threadHiID); //删除某个任务 } /*****任务二*****/
void threadLo(void)
{
// int sum = 0;
// while (1)
// {
// printf("This is BearPi Harmony Thread2----%d\r\n", sum++);
// usleep(500000);
// }
for (int i = 0;i<10;i++){
printf("enter threadLo\r\n");
}
printf("threadHi osThreadSuspend success\r\n");
osThreadResume(threadHiID); // 任务恢复
osThreadTerminate(threadLoID); //删除某个任务
} /*****任务创建*****/
static void Thread_example(void)
{
osThreadAttr_t attr; threadHiID = osThreadNew((osThreadFunc_t)threadHi,NULL,&attr);
if (threadHiID == NULL)
{
printf("Falied to create threadHi!\n");
} attr.name = "threadLo";
attr.priority = 24 ;
threadLoID =osThreadNew((osThreadFunc_t)threadLo,NULL,&attr); if (threadLoID== NULL)
{
printf("Falied to create threadLo!\n");
}
} APP_FEATURE_INIT(Thread_example);
// SYS_RUN(Thread_example);
二、信号量开发案例
基本概念:信号量(Semaphore)是一种实现任务间通信的机制,实现任务之间同步或临界资源的互斥访问。常用于协助一组相

互竞争的任务来访问临界资源。
1、在多任务系统中,各任务之间需要同步或互斥实现临界资源的保护,信号量功能可以为用户提供这方面的支持。
 
2、通常一个信号量的计数值用于对应有效的资源数,表示剩下的可被占用的互斥资源数。其值的含义分两种情况:
      1)0,表示没有积累下来的Post信号量操作,且有可能有在此信号量上阻塞的任务。
      2)正值,表示有一个或多个Post信号量操作。
 
4、以同步为目的的信号量和以互斥为目的的信号量在使用有如下不同:
     1)用作互斥时,信号量创建后记数是满的,在需要使用临界资源时,先取信号量,使其变空,这样其他任务需要使用
          临界资源时就会因为无法取到信号量而阻塞,从而保证了临界资源的安全。
 
     2)用作同步时,信号量在创建后被置为空,任务1取信号量而阻塞,任务2在某种条件发生后,释放信号量,于是任务
         1得以进入READY或RUNNING态,从而达到了两个任务间的同步。
 
#include <stdio.h>
#include <string.h>
#include <unistd.h> #include "ohos_init.h"
#include "cmsis_os2.h" osSemaphoreId_t sem1; void Thread_Semaphore1(void)
{
osStatus_t status;
while (1)
{
//申请两次sem1信号量,使得Thread_Semaphore2和Thread_Semaphore3能同步执行
status = osSemaphoreRelease(sem1);
if (status!=osOK){
printf("semaphore fail");
}else{
printf("semaphore success");
} //此处若只申请一次信号量,则Thread_Semaphore2和Thread_Semaphore3会交替运行。
// osSemaphoreRelease(sem1); // printf("Thread_Semaphore i %d \n",i);
// i=i+1;
// printf("Thread_Semaphore sem1 %d \n",sem1);
// printf("Thread_Semaphore1 Release Semap \n");
osDelay(100);
}
}
void Thread_Semaphore2(void)
{
osStatus_t status;
while (1)
{
//等待sem1信号量
status = osSemaphoreAcquire(sem1, 50U);
if (status!=osOK){
printf("semaphore2 fail");
}else{
printf("semaphore2 success");
}
}
} void Thread_Semaphore3(void)
{
osStatus_t status;
while (1)
{
//等待sem1信号量
status = osSemaphoreAcquire(sem1, osWaitForever);
if (status!=osOK){
printf("semaphore3 fail");
}else{
printf("semaphore3 success");
}
osDelay(1);
}
} void Semaphore_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.priority = 24; attr.name = "Thread_Semaphore1";
if (osThreadNew((osThreadFunc_t)Thread_Semaphore1, NULL, &attr) == NULL)
{
printf("Falied to create Thread_Semaphore1!\n");
}
attr.name = "Thread_Semaphore2";
if (osThreadNew((osThreadFunc_t)Thread_Semaphore2, NULL, &attr) == NULL)
{
printf("Falied to create Thread_Semaphore2!\n");
}
attr.name = "Thread_Semaphore3";
if (osThreadNew((osThreadFunc_t)Thread_Semaphore3, NULL, &attr) == NULL)
{
printf("Falied to create Thread_Semaphore3!\n");
}
sem1 = osSemaphoreNew(4, 0, NULL);
if (sem1 == NULL)
{
printf("Falied to create Semaphore1!\n");
}
}
APP_FEATURE_INIT(Semaphore_example);
BUILD.gn文件:

static_library("semaphore_example") {
sources = [
"Semaphore_example.c"
] include_dirs = [
"//utils/native/lite/include",
"//kernel/liteos_m/components/cmsis/2.0",
]
}

BUILD.gn

import("//build/lite/config/component/lite_component.gni")

lite_component("app") {
features = [
"A5_kernel_semaphore:semaphore_example"
]
}

代码写完后用hpm dist命令来编译

 烧录代码到开发板:

后台log

 

 

基于小熊派Hi3861鸿蒙开发的IoT物联网学习【二】的更多相关文章

  1. 基于小熊派Hi3861鸿蒙开发的IoT物联网学习【一】

    基于小熊派鸿蒙季BearPi-HM_Nano HarmonyOS 鸿蒙系统Hi3861开发板NFC  开发步骤:1.购买开发板:某宝上购买就行 2.安装开发环境 3.下载源码 4.编写案例并执行 开发 ...

  2. 基于小熊派Hi3861鸿蒙开发的IoT物联网学习【五】

    BearPi-HM_Nano开发板鸿蒙OS内核编程开发--消息队列 什么是消息队列?        答:消息队列中间件是分布式系统中重要的组件,主要解决应用耦合.异步消息.流量削锋等问题.实现高性能. ...

  3. 基于小熊派Hi3861鸿蒙开发的IoT物联网学习【三】

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

  4. 基于小熊派Hi3861鸿蒙开发的IoT物联网学习【四】

    一.互斥锁基本概念: 1.互斥锁又称互斥型信号量,是一种特殊的二值性信号量[二值型信号量可以理解为任务与中断间或者两个任务间的标志,该标志非"满"即"空"],用 ...

  5. 基于小程序云Serverless开发微信小程序

    本文主要以使用小程序云Serverless服务开发一个记事本微信小程序为例介绍如何使用小程序云Serverless开发微信小程序.记事本小程序的开发涉及到云函数调用.云数据库存储.图片存储等功能,较好 ...

  6. 如何基于App SDK快速地开发一个IoT App?

    一.背景及大纲介绍 在如今物联网DCM(Device.Connect.Manage)的大框架下,有一个应用层来分析和处理数据,是必备技能.但是,对于一个公司来说,因为研发能力或者研发时间的原因,可能很 ...

  7. 华为云MVP熊保松谈物联网开发:华为云IoT是首选,小熊派是神器

    摘要:在AI.5G的技术驱动下,物联网行业的发展愈加如火如荼,开发者在技术的快速更迭间,也得乘风破浪跟上新技术的节奏. 在AI.5G的技术驱动下,物联网行业的发展愈加如火如荼,开发者在技术的快速更迭间 ...

  8. 开发实践丨用小熊派STM32开发板模拟自动售货机

    摘要:本文内容是讲述用小熊派开发板模拟自动售货机,基于论坛提供的工程代码,通过云端开发和设备终端开发,实现终端数据在的华为云平台显示. 本文内容是讲述用小熊派开发板模拟自动售货机,基于论坛提供的工程代 ...

  9. 【资源下载】Linux下的Hi3861一站式鸿蒙开发烧录(附工具)

    下载附件 2021春节前夕,华为发布了 HUAWEI DevEco Device Tool 2.0 Beta1,整体提供了异常强大的功能.得知消息后,我在第一时间带着无比兴奋的心情下载尝鲜,但结果却是 ...

随机推荐

  1. NX二次开发】Block UI 体收集器

    属性说明 属性   类型   描述   常规           BlockID    String    控件ID    Enable    Logical    是否可操作    Group    ...

  2. Selective Kernel Networks

    摘要:在标准的卷积神经网络(CNNs)中,每一层的人工神经元的感受野被设计成具有相同的大小.众所周知,视觉皮层神经元的感受野大小受刺激的调节,但在构建cnn时却很少考虑到这一点.我们在神经网络中提出了 ...

  3. 解决git冲突

    多个开发者同时操作git中的同一个文件,第一个人在commit和push的时候是可以正常提交的,而之后的开发者执行pull,就会报冲突异常conflict. 解决方案: 全部采用当前更改 之后再去gi ...

  4. css基本内容笔记(学习整理)

    一.css简介 1.什么是css 层叠样式表. 层叠:层层叠加,若果有冲突应用优先级高,不冲突的部分共同作用 样式表:就是css属性样式的集合: 2.作用 a.修饰html,使得html样式更好看 b ...

  5. JavaScript中基本数据类型和引用数据类型的区别(栈——堆)

    JavaScript中基本数据类型和引用数据类型的区别 1.基本数据类型和引用数据类型 ECMAScript包括两个不同类型的值:基本数据类型和引用数据类型. 基本数据类型指的是简单的数据段,引用数据 ...

  6. docker2-镜像原理及创建新的镜像

    1,镜像是什么 镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码.运行时.库.环境变量和配置文件 在docker中所有应用 ...

  7. SQL server中自定义排序

    select * from OrderPolicyDetail order by ( case Project when 'C' then 1, when 'A' then 2, when 'D' t ...

  8. CosId 1.0.3 发布,通用、灵活、高性能的分布式 ID 生成器

    CosId 通用.灵活.高性能的分布式 ID 生成器 介绍 CosId 旨在提供通用.灵活.高性能的分布式系统 ID 生成器. 目前提供了俩大类 ID 生成器:SnowflakeId (单机 TPS ...

  9. excel VBA一个fuction同时执行多个正则表达式,实现方法

    代码: Function zhengze3(ze1 As String, ze2 As String, Rng1 As Range, Rng2 As Range)    Set regx1 = Cre ...

  10. 乘风破浪,.Net Core遇见Dapr,为云原生而生的分布式应用运行时

    Dapr是一个由微软主导的云原生开源项目,国内云计算巨头阿里云也积极参与其中,2019年10月首次发布,到今年2月正式发布V1.0版本.在不到一年半的时间内,github star数达到了1.2万,超 ...