自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Niobe開發(fā)板中基于OpenHarmony操作系統(tǒng)進(jìn)行多線程(多任務(wù))開發(fā)

系統(tǒng) OpenHarmony
OpenHarmony LiteOS可以給用戶提供多個(gè)線程,實(shí)現(xiàn)線程間的切換,幫助用戶管理業(yè)務(wù)程序流程。

??想了解更多內(nèi)容,請(qǐng)?jiān)L問:??

??51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)??

??https://ost.51cto.com??

niobe開發(fā)套件詳情介紹:??Niobe行業(yè)物聯(lián)網(wǎng)開發(fā)板及套件詳解??

線程的基本概念

從系統(tǒng)角度看,線程是競(jìng)爭(zhēng)系統(tǒng)資源的最小運(yùn)行單元。線程可以使用或等待CPU、使用內(nèi)存空間等系統(tǒng)資源,并獨(dú)立于其它線程運(yùn)行。

OpenHarmony LiteOS可以給用戶提供多個(gè)線程,實(shí)現(xiàn)線程間的切換,幫助用戶管理業(yè)務(wù)程序流程。具有如下特性:

  1. 支持多線程。
  2. 一個(gè)線程代表一個(gè)任務(wù)。
  3. 搶占式調(diào)度機(jī)制,高優(yōu)先級(jí)的線程可打斷低優(yōu)先級(jí)線程,低優(yōu)先級(jí)線程必須在高優(yōu)先級(jí)線程阻塞或結(jié)束后才能得到調(diào)度。
  4. 相同優(yōu)先級(jí)線程支持時(shí)間片輪轉(zhuǎn)調(diào)度方式。
  5. 共有32個(gè)優(yōu)先級(jí)[0-31],最高優(yōu)先級(jí)為0,最低優(yōu)先級(jí)為31。用戶進(jìn)程可配置的優(yōu)先級(jí)有22個(gè) (10~31)。

1、線程的狀態(tài)

線程有多種運(yùn)行狀態(tài)。系統(tǒng)初始化完成后,創(chuàng)建的線程就可以在系統(tǒng)中競(jìng)爭(zhēng)一定的資源,由內(nèi)核進(jìn)行調(diào)度。

線程狀態(tài)通常分為以下四種:

  • 就緒(Ready):該線程在就緒隊(duì)列中,只等待CPU。
  • 運(yùn)行(Running):該線程正在執(zhí)行。
  • 阻塞(Blocked):該線程不在就緒隊(duì)列中。包含線程被掛起(suspend狀態(tài))、線程被延時(shí)(delay狀態(tài))、線程正在等待信號(hào)量、讀寫隊(duì)列或者等待事件等。
  • 退出態(tài)(Dead):該線程運(yùn)行結(jié)束,等待系統(tǒng)回收資源。

2、 線程狀態(tài)遷移

就緒態(tài)→運(yùn)行態(tài): 任務(wù)創(chuàng)建后進(jìn)入就緒態(tài),發(fā)生任務(wù)切換時(shí),就緒隊(duì)列中最高優(yōu)先級(jí)的任務(wù)被執(zhí)行,從而進(jìn)入運(yùn)行態(tài),同時(shí)該任務(wù)從就緒隊(duì)列中移出。

運(yùn)行態(tài)→阻塞態(tài) :正在運(yùn)行的任務(wù)發(fā)生阻塞(掛起、延時(shí)、讀信號(hào)量等)時(shí),將該任務(wù)插入到對(duì)應(yīng)的阻塞隊(duì)列中,任務(wù)狀態(tài)由運(yùn)行態(tài)變成阻塞態(tài),然后發(fā)生任務(wù)切換,運(yùn)行就緒隊(duì)列中最高優(yōu)先級(jí)任務(wù)。

阻塞態(tài)→就緒態(tài)(阻塞態(tài)→運(yùn)行態(tài)):阻塞的任務(wù)被恢復(fù)后(任務(wù)恢復(fù)、延時(shí)時(shí)間超時(shí)、讀信號(hào)量超時(shí)或讀到信號(hào)量等),此時(shí)被恢復(fù)的任務(wù)會(huì)被加入就緒隊(duì)列,從而由阻塞態(tài)變成就緒態(tài);此時(shí)如果被恢復(fù)任務(wù)的優(yōu)先級(jí)高于正在運(yùn)行任務(wù)的優(yōu)先級(jí),則會(huì)發(fā)生任務(wù)切換,該任務(wù)由就緒態(tài)變成運(yùn)行態(tài)。

就緒態(tài)→阻塞態(tài) : 任務(wù)也有可能在就緒態(tài)時(shí)被阻塞(掛起),此時(shí)任務(wù)狀態(tài)由就緒態(tài)變?yōu)樽枞麘B(tài),該任務(wù)從就緒隊(duì)列中刪除,不會(huì)參與任務(wù)調(diào)度,直到該任務(wù)被恢復(fù)。

運(yùn)行態(tài)→就緒態(tài) : 有更高優(yōu)先級(jí)任務(wù)創(chuàng)建或者恢復(fù)后,會(huì)發(fā)生任務(wù)調(diào)度,此刻就緒隊(duì)列中最高優(yōu)先級(jí)任務(wù)變?yōu)檫\(yùn)行態(tài),那么原先運(yùn)行的任務(wù)由運(yùn)行態(tài)變?yōu)榫途w態(tài),依然在就緒隊(duì)列中。

運(yùn)行態(tài)→退出態(tài) : 運(yùn)行中的任務(wù)運(yùn)行結(jié)束,任務(wù)狀態(tài)由運(yùn)行態(tài)變?yōu)橥顺鰬B(tài)。退出態(tài)包含任務(wù)運(yùn)行結(jié)束的正常退出狀態(tài)以及Invalid狀態(tài)。例如,任務(wù)運(yùn)行結(jié)束但是沒有自刪除,對(duì)外呈現(xiàn)的就是Invalid狀態(tài),即退出態(tài)。

阻塞態(tài)→退出態(tài) : 阻塞的任務(wù)調(diào)用刪除接口,任務(wù)狀態(tài)由阻塞態(tài)變?yōu)橥顺鰬B(tài)。

3、線程管理

對(duì)于多線程的場(chǎng)景,HarmonyOS內(nèi)核管理線程靠任務(wù)池和就緒隊(duì)列,執(zhí)行靠調(diào)度算法。

調(diào)度算法:HarmonyOS內(nèi)核中的線程采用搶占式調(diào)度機(jī)制,同時(shí)支持SCHED_RR和SCHED_FIFO調(diào)度策略

RR策略能基本保證我們每個(gè)任務(wù)都能夠得到有效的執(zhí)行,不會(huì)有一些任務(wù)進(jìn)行長(zhǎng)時(shí)間等待

FIFO策略優(yōu)點(diǎn)在于任務(wù)的切換比較簡(jiǎn)單,而且對(duì)于一些時(shí)間片不好把握的任務(wù)來說,F(xiàn)IFO能偶更有效的利用我們的cpu。

線程相關(guān)API

此處介紹cmsis2.0的線程接口,頭文件:”//third_party/cmsis/CMSIS/RTOS2/Include/cmsis_os2.h”

創(chuàng)建線程

osThreadId_t osThreadNew (osThreadFunc_t func, void *argument, const osThreadAttr_t *attr);

函數(shù)osThreadNew通過將線程添加到活動(dòng)線程列表并將其設(shè)置為就緒狀態(tài)來啟動(dòng)線程函數(shù)。線程函數(shù)的參數(shù)使用參數(shù)指針*argument傳遞。當(dāng)創(chuàng)建的thread函數(shù)的優(yōu)先級(jí)高于當(dāng)前運(yùn)行的線程時(shí),創(chuàng)建的thread函數(shù)立即啟動(dòng)并成為新的運(yùn)行線程。線程屬性是用參數(shù)指針attr定義的。屬性包括線程優(yōu)先級(jí)、堆棧大小或內(nèi)存分配的設(shè)置。可以在RTOS啟動(dòng)(調(diào)用 osKernelStart)之前安全地調(diào)用該函數(shù),但不能在內(nèi)核初始化 (調(diào)用 osKernelInitialize)之前調(diào)用該函數(shù)。

開發(fā)實(shí)例

1、 確定目錄結(jié)構(gòu)

先在路徑./applications/app下新建一個(gè)目錄,用于存放業(yè)務(wù)源碼文件。其中“.”表示OpenHarmony源碼的根目錄。

例如:在app下新增業(yè)務(wù)NIOBE_OS_helloworld,其中hello_world.c為業(yè)務(wù)代碼,BUILD.gn為編譯腳本,其目錄結(jié)構(gòu)如下:

.
└── applications
└── app
│── TW002_OS_thread
│── os_thread_example.c
└── BUILD.gn
└── BUILD.gn

2、 編寫業(yè)務(wù)代碼

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
/*****任務(wù)一*****/
void thread_entry1(void)
{
int sum = 0;
while (1)
{
printf("This is Niobe Thread1----%d\r\n", sum++);
usleep(500000);
}
}
/*****任務(wù)二*****/
void thread_entry2(void)
{
int sum = 0;
while (1)
{
printf("This is Niobe Thread2----%d\r\n", sum++);
usleep(500000);
}
}
/*****任務(wù)創(chuàng)建*****/
static void OS_Thread_example(void)
{
osThreadAttr_t attr;
attr.name = "thread1";
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((osThreadFunc_t)thread_entry1, NULL, &attr) == NULL)
{
printf("Falied to create thread1!\n");
}
attr.name = "thread2";
if (osThreadNew((osThreadFunc_t)thread_entry2, NULL, &attr) == NULL)
{
printf("Falied to create thread2!\n");
}
}

3、 編寫將業(yè)務(wù)構(gòu)建成靜態(tài)庫的BUILD.gn

static_library("os_thread_example"){
sources = [
"os_thread_example.c"
]
include_dirs = [
"http://third_party/cmsis/CMSIS/RTOS2/Include"
]
}

4、編寫模塊BUILD.gn文件

import("http://build/lite/config/component/lite_component.gni")
lite_component("app") {
features = [
#"NIOBE_OS_helloworld:helloworld",
"TW002_OS_thread:os_thread_example"
]
}

編譯

用docker編譯,進(jìn)入OpenHarmony代碼根目錄,運(yùn)行命令進(jìn)入docker鏡像,在鏡像中用hb編譯:

sudo docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:0.0.5   
hb set
.
//繼續(xù)回車選擇niobe_wifi_iot
hb build -b release -f

等待編譯成功。

燒錄

編譯成功后,bin文件會(huì)保存在out/niobe/niobe_wifi_iot目錄下:

用HiBurn.exe將Hi3861_wifiiot_app_allinone.bin文件燒錄到niobe核心板上:

首先用typeC線連接電腦和Niobe核心板,可通過設(shè)備管理確定Niobe連接的端口號(hào),該端口號(hào)后續(xù)HiBurn和sscom都需要。

再通過HiBurn.exe工具將固件燒錄到Niobe上,HiBurn工具的獲取和操作可參考燒錄指導(dǎo)

調(diào)試

采用串口調(diào)試工具sscom查看串口打印信息,先對(duì)sscom進(jìn)行配置,設(shè)置端口號(hào)、波特率等:

點(diǎn)擊打開串口,按下Niobe核心板上的復(fù)位按鍵,可通過sscom看到串口打印日志如下:

This is Niobe Thread1----2
This is Niobe Thread2----5
This is Niobe Thread1----3
This is Niobe Thread2----6

可以看到線程thread_entry1和線程thread_entry2交替運(yùn)行。

??想了解更多內(nèi)容,請(qǐng)?jiān)L問:??

??51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)??

??https://ost.51cto.com??


責(zé)任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2022-02-24 16:39:41

OpenHarmonNiobe開發(fā)鴻蒙

2022-10-14 15:55:24

環(huán)境搭建鴻蒙

2022-04-01 15:54:01

DHCP網(wǎng)絡(luò)協(xié)議開發(fā)板

2022-01-07 21:11:27

鴻蒙HarmonyOS應(yīng)用

2011-05-31 13:29:40

Android 多線程

2023-08-02 09:29:40

任務(wù)池TaskPool

2023-08-01 16:35:48

鴻蒙ArkUI應(yīng)用開發(fā)

2021-10-11 14:14:42

鴻蒙HarmonyOS應(yīng)用

2009-07-17 17:29:13

多任務(wù)多線程

2022-03-03 19:21:50

Harmony鴻蒙操作系統(tǒng)

2020-12-29 09:59:01

鴻蒙HarmonyOS智能家居

2011-02-28 14:34:01

蘋果iOS

2022-02-16 16:01:02

Hi3516開發(fā)板鴻蒙

2021-12-16 15:14:54

鴻蒙HarmonyOS應(yīng)用

2020-12-16 10:05:48

鴻蒙開發(fā)板Onenet平臺(tái)

2021-09-10 10:01:04

鴻蒙HarmonyOS應(yīng)用

2023-08-12 11:22:29

deepin

2023-06-29 18:07:12

deepin

2013-02-20 09:25:53

UbuntuUbuntu手機(jī)Ubuntu平板操作系
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)