Hi3861 OpenHarmony嵌入式应用入门--LiteOS semaphore作为锁
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "hi_task.h"
osSemaphoreId_t binarySem;
void task1_entry(void *arg)
{
(void)arg;
while (1) {
// 获取信号量,若无法获取,则进入阻塞状态
osSemaphoreAcquire(binarySem, osWaitForever);
printf("Task1 is running...\n");
// 释放信号量,以允许其它任务运行
osSemaphoreRelease(binarySem);
// 休眠一段时间,以便让出CPU使用权
osDelay(500);
}
}
void task2_entry(void *arg)
{
(void)arg;
while (1) {
// 获取信号量,若无法获取,则进入阻塞状态
osSemaphoreAcquire(binarySem, osWaitForever);
printf("Task2 is running...\n");
// 释放信号量,以允许其它任务运行
osSemaphoreRelease(binarySem);
// 休眠一段时间,以便让出CPU使用权
osDelay(1000);
}
}
// 初始化信号量作为锁
static void semaphore_init(void)
{
// 创建一个二值信号量,初始状态为可用
binarySem = osSemaphoreNew(1, 1, NULL);
}
// 创建任务
static void task_create(void)
{
osThreadAttr_t attr;
attr.name = "task1";
attr.attr_bits = 0U;
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.stack_mem = NULL;
attr.stack_size = 1024 * 4;
attr.priority = 25;
if (osThreadNew(task1_entry, NULL, &attr) == NULL) {
printf("Failed to create task1!\n");
}
attr.name = "task2";
attr.priority = 26;
if (osThreadNew(task2_entry, NULL, &attr) == NULL) {
printf("Failed to create task2!\n");
}
}
// 应用程序入口
int app_entry(void)
{
// 初始化信号量
semaphore_init();
// 创建任务
task_create();
return 0;
}
这段代码展示了如何在OpenHarmony(基于LiteOS)操作系统中使用二值信号量作为锁来同步两个任务。它首先定义了一个二值信号量binarySem
,然后初始化这个信号量。接着,它创建了两个任务task1
和task2
,这两个任务都会试图获取这个信号量。只有在释放了信号量的情况下,另一个任务才能获取到信号量,从而实现任务间的同步。这个例子有助于开发者理解如何在嵌入式设备中使用操作系统提供的同步机制来管理任务间的并发。
评论已关闭