成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

【FFH】小熊派驅(qū)動調(diào)用流程(以調(diào)用LED燈驅(qū)動為例)

原創(chuàng)
系統(tǒng) OpenHarmony
驅(qū)動調(diào)用的流程和純代碼開發(fā)的流程十分相似,本文著重點在于驅(qū)動調(diào)用的邏輯。

??想了解更多內(nèi)容,請訪問:??

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

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

一、流程總覽

驅(qū)動調(diào)用的流程和純代碼開發(fā)的流程十分相似,本文著重點在于驅(qū)動調(diào)用的邏輯。

創(chuàng)建目錄及相應源碼文件–>編寫驅(qū)動調(diào)用代碼–>編寫編譯構建文件BUILD.gn–>編譯燒錄運行

二、源碼目錄結構

在./applications/BearPi/BearPi-HM_Micro/samples/目錄下創(chuàng)建

my_led_app 源碼目錄

*my_led_app.c 驅(qū)動調(diào)用源碼

*BUILD.gn 源碼編譯腳本

如圖所示

三、編寫驅(qū)動調(diào)用代碼

在my_led_app.c中編寫如下代碼

#include <fcntl.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <stdio.h>
#include "hdf_sbuf.h"
#include "hdf_io_service_if.h"

#define LED_WRITE_READ 1
#define LED_SERVICE "hdf_led"

static int SendEvent(struct HdfIoService *serv, uint8_t eventData)
{
int ret = 0;
struct HdfSBuf *data = HdfSBufObtainDefaultSize();
if (data == NULL)
{
printf("fail to obtain sbuf data!\r\n");
return 1;
}

struct HdfSBuf *reply = HdfSBufObtainDefaultSize();
if (reply == NULL)
{
printf("fail to obtain sbuf reply!\r\n");
ret = HDF_DEV_ERR_NO_MEMORY;
goto out;
}
/* 寫入數(shù)據(jù) */
if (!HdfSbufWriteUint8(data, eventData))
{
printf("fail to write sbuf!\r\n");
ret = HDF_FAILURE;
goto out;
}
/* 通過Dispatch發(fā)送到驅(qū)動 */
ret = serv->dispatcher->Dispatch(&serv->object, LED_WRITE_READ, data, reply);
if (ret != HDF_SUCCESS)
{
printf("fail to send service call!\r\n");
goto out;
}

int replyData = 0;
/* 讀取驅(qū)動的回復數(shù)據(jù) */
if (!HdfSbufReadInt32(reply, &replyData))
{
printf("fail to get service call reply!\r\n");
ret = HDF_ERR_INVALID_OBJECT;
goto out;
}
printf("\r\nGet reply is: %d\r\n", replyData);
out:
HdfSBufRecycle(data);
HdfSBufRecycle(reply);
return ret;
}

int main(int argc, char **argv)
{
int i;

/* 獲取服務 */
struct HdfIoService *serv = HdfIoServiceBind(LED_SERVICE);
if (serv == NULL)
{
printf("fail to get service %s!\r\n", LED_SERVICE);
return HDF_FAILURE;
}

for (i=0; i < argc; i++)
{
printf("\r\nArgument %d is %s.\r\n", i, argv[i]);
}

SendEvent(serv, atoi(argv[1]));

HdfIoServiceRecycle(serv);
printf("exit");

return HDF_SUCCESS;
}

這一部分是本文的重點部分

OpenHarmony的設備開發(fā)中的驅(qū)動調(diào)用與單片機的驅(qū)動開發(fā)不太相同,以往單片機的驅(qū)動調(diào)用往往是采用庫函數(shù)調(diào)用的方式,但OpenHarmony的驅(qū)動調(diào)用采用的是驅(qū)動程序暴露出一個server,程序通過Dispatch發(fā)送指令的方式。有點類似與ROS的消息通信機制中的話題發(fā)布和訂閱。在OpenHarmony中驅(qū)動調(diào)用的這部分程序?qū)儆谟脩舫绦?,是用戶態(tài)的內(nèi)容,而驅(qū)動是內(nèi)核態(tài)的內(nèi)容。所以用戶程序無法直接訪問驅(qū)動,上面代碼通過Dispatch向驅(qū)動程序發(fā)送指令從而實現(xiàn)LED燈的亮滅。

3.1 發(fā)送指令到驅(qū)動程序

我們看下my_led_app.c中SendEvent函數(shù)中通過Dispatch發(fā)送到驅(qū)動的代碼

/* 通過Dispatch發(fā)送到驅(qū)動 */
ret = serv->dispatcher->Dispatch(&serv->object, LED_WRITE_READ, data, reply);
if (ret != HDF_SUCCESS)
{
printf("fail to send service call!\r\n");
goto out;
}

int replyData = 0;

這段代碼實現(xiàn)將指令發(fā)送到驅(qū)動程序

驅(qū)動程序指令接受的的代碼在上一篇文章中的led.c驅(qū)動代碼中的LedDriverDispatch函數(shù)

// Dispatch是用來處理用戶態(tài)發(fā)下來的消息
int32_t LedDriverDispatch(struct HdfDeviceIoClient *client, int cmdCode, struct HdfSBuf *data, struct HdfSBuf *reply)
{
uint8_t contrl;
HDF_LOGE("Led driver dispatch");
if (client == NULL || client->device == NULL)
{
HDF_LOGE("Led driver device is NULL");
return HDF_ERR_INVALID_OBJECT;
}

switch (cmdCode)
{
/* 接收到用戶態(tài)發(fā)來的LED_WRITE_READ命令 */
case LED_WRITE_READ:
/* 讀取data里的數(shù)據(jù),賦值給contrl */
HdfSbufReadUint8(data,&contrl);
switch (contrl)
{
/* 開燈 */
case LED_ON:
GpioWrite(g_Stm32Mp1ILed.gpioNum, GPIO_VAL_LOW);
status = 1;
break;
/* 關燈 */
case LED_OFF:
GpioWrite(g_Stm32Mp1ILed.gpioNum, GPIO_VAL_HIGH);
status = 0;
break;
/* 狀態(tài)翻轉(zhuǎn) */
case LED_TOGGLE:
if(status == 0)
{
GpioWrite(g_Stm32Mp1ILed.gpioNum, GPIO_VAL_LOW);
status = 1;
}
else
{
GpioWrite(g_Stm32Mp1ILed.gpioNum, GPIO_VAL_HIGH);
status = 0;
}
break;
default:
break;
}
/* 把LED的狀態(tài)值寫入reply, 可被帶至用戶程序 */
if (!HdfSbufWriteInt32(reply, status))
{
HDF_LOGE("replay is fail");
return HDF_FAILURE;
}
break;
default:
break;
}
return HDF_SUCCESS;
}

3.2 從驅(qū)動程序接受數(shù)據(jù)

剛剛實現(xiàn)了用戶態(tài)向內(nèi)核態(tài)發(fā)送指令,同理,內(nèi)核態(tài)也可以向用戶態(tài)發(fā)送數(shù)據(jù)。

讓我們看看驅(qū)動代碼中向用戶發(fā)送LED狀態(tài)信息的代碼(在led.c中LedDriverDispatch函數(shù)的一部分)

/* 把LED的狀態(tài)值寫入reply, 可被帶至用戶程序 */
if (!HdfSbufWriteInt32(reply, status))
{
HDF_LOGE("replay is fail");
return HDF_FAILURE;
}

下面是用戶程序接收的部分

/* 讀取驅(qū)動的回復數(shù)據(jù) */
if (!HdfSbufReadInt32(reply, &replyData))
{
printf("fail to get service call reply!\r\n");
ret = HDF_ERR_INVALID_OBJECT;
goto out;
}
printf("\r\nGet reply is: %d\r\n", replyData);

四、編寫編譯構建文件BUILD.gn

在BUILD.gn中添加以下代碼

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

HDF_FRAMEWORKS = "http://drivers/framework"

executable("led_lib") {
output_name = "my_led"
sources = [
"my_led_app.c",
]

include_dirs = [
"$HDF_FRAMEWORKS/ability/sbuf/include",
"$HDF_FRAMEWORKS/core/shared/include",
"$HDF_FRAMEWORKS/core/host/include",
"$HDF_FRAMEWORKS/core/master/include",
"$HDF_FRAMEWORKS/include/core",
"$HDF_FRAMEWORKS/include/utils",
"$HDF_FRAMEWORKS/utils/include",
"$HDF_FRAMEWORKS/include/osal",
"http://drivers/adapter/uhdf/posix/include",
"http://third_party/bounds_checking_function/include",
"http://base/hiviewdfx/hilog_lite/interfaces/native/innerkits",
]

deps = [
"http://base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared",
"http://drivers/adapter/uhdf/manager:hdf_core",
"http://drivers/adapter/uhdf/posix:hdf_posix_osal",
]
}

lite_component("my_led_app") {
features = [
":led_lib",
]
}

五、編譯燒錄

參考之前文章Linux下配置小熊派-鴻蒙·叔設備開發(fā)(南向)的開發(fā)環(huán)境

六、運行

串口連接小熊派終端

./bin/my_led 0 #關閉LED
./bin/my_led 1 #開啟LED
./bin/my_led 2 #翻轉(zhuǎn)LED

??想了解更多內(nèi)容,請訪問:??

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

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

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

2022-02-14 14:28:57

驅(qū)動開發(fā)鴻蒙系統(tǒng)

2022-02-25 14:33:03

JS接口鴻蒙應用開發(fā)

2022-02-17 19:59:10

LED燈開發(fā)鴻蒙

2023-09-06 15:35:14

2022-02-11 13:49:42

Linux系統(tǒng)鴻蒙

2023-03-20 16:21:26

ADC數(shù)字轉(zhuǎn)換器

2023-03-21 18:06:49

ADC數(shù)字轉(zhuǎn)換器

2016-12-20 12:34:46

存儲MySQL流程

2022-03-14 15:11:01

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

2022-08-10 15:58:54

LED燈鴻蒙

2022-08-08 19:35:37

HDF驅(qū)動開發(fā)鴻蒙

2023-03-24 14:47:24

NAPI框架HDF框架

2021-12-30 16:12:07

鴻蒙HarmonyOS應用

2025-04-10 16:01:21

2011-08-23 16:23:13

OracleMySQLSQL Server

2024-09-23 19:18:56

數(shù)據(jù)驅(qū)動數(shù)據(jù)收集數(shù)據(jù)分析

2015-02-06 13:32:57

TestinCTO徐琨

2017-03-23 14:58:00

互聯(lián)網(wǎng)

2022-01-05 20:27:45

鴻蒙HarmonyOS應用
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 九九福利 | 久久久久久亚洲精品 | www.888www看片| 日本一区二区高清不卡 | 欧美激情 一区 | 中文字幕在线观看www | 一级日批片| 在线视频中文字幕 | 国产精品国产a级 | 亚洲黄色高清视频 | 国产一区二区不卡 | 国产精品久久久久久久免费观看 | 手机av在线 | 黑人巨大精品欧美一区二区免费 | 午夜免费观看体验区 | 亚洲一区视频 | 美国一级黄色片 | 蜜臀久久99精品久久久久野外 | 亚洲一区精品视频 | 亚洲一区 | 亚洲综合色视频在线观看 | 二区高清 | 国产视频一区在线观看 | 国产成人综合久久 | 国产一区二区三区四区 | 亚州精品天堂中文字幕 | 国产精品日韩高清伦字幕搜索 | 毛片一级黄色 | 免费一级欧美在线观看视频 | 国产精品1区| 成人av网站在线观看 | 成人二区 | 国产成人网 | 在线日韩视频 | 日韩视频在线一区 | 亚洲 欧美 日韩在线 | 蜜桃视频在线观看免费视频网站www | 91亚洲国产成人久久精品网站 | 激情欧美日韩一区二区 | 日韩a | 国产免费一区二区三区 |