LiteOS驅(qū)動(dòng)移植方法是什么

本篇內(nèi)容主要講解“LiteOS驅(qū)動(dòng)移植方法是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“LiteOS驅(qū)動(dòng)移植方法是什么”吧!

10年積累的做網(wǎng)站、網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有瑞麗免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

1. LiteOS裸機(jī)驅(qū)動(dòng)移植系列

俗話說的好,光說不練假把式,上一個(gè)系列 LiteOS內(nèi)核實(shí)戰(zhàn)教程 中講述了內(nèi)核中任務(wù)如何管理、如何使用信號(hào)量同步多個(gè)任務(wù)的運(yùn)行,如何用互斥鎖保護(hù)共享資源,如何申請(qǐng)分配動(dòng)態(tài)內(nèi)存空間,但是在嵌入式系統(tǒng)中,如果不能將內(nèi)核有效的應(yīng)用在實(shí)際場(chǎng)景中控制外圍設(shè)備,那么一切都是紙上談兵。在這個(gè)系列中,本教程將會(huì)帶領(lǐng)大家,手把手添加一些常用的外設(shè)驅(qū)動(dòng)到LiteOS系統(tǒng)中,掌握外設(shè)驅(qū)動(dòng)的移植方法。

2. 何為裸機(jī)驅(qū)動(dòng)

驅(qū)動(dòng)層代碼,簡(jiǎn)單通俗的來說就是向上給用戶提供一層可以控制設(shè)備的API,向下負(fù)責(zé)和設(shè)備打交道,直接操作硬件。

比如LED的驅(qū)動(dòng)代碼可以給用戶提供一個(gè)初始化的 API 和打開/關(guān)閉的 API ,按鍵的驅(qū)動(dòng)代碼可以提供初始化的 API 和讀取按鍵狀態(tài)的 API,LCD的驅(qū)動(dòng)代碼可以提供初始化的 API 和屏幕上顯示相關(guān)內(nèi)容的API,傳感器的驅(qū)動(dòng)代碼可以提供傳感器初始化的API 和讀取數(shù)據(jù)的 API,等等。

如果對(duì)基于HAL庫的裸機(jī)驅(qū)動(dòng)不熟悉,請(qǐng)先閱讀嵌入式基礎(chǔ)教程!

這里以使用 STM32CuebMX 生成的 LED 閃爍的裸機(jī)工程為例,其中 Src 目錄下的gpio.c文件就相當(dāng)于 LED 的驅(qū)動(dòng)層文件,其中提供了 LED 的初始化代碼:

LiteOS驅(qū)動(dòng)移植方法是什么

有了該文件,也就是驅(qū)動(dòng)層代碼,我們可以直接調(diào)用MX_GPIO_Init來初始化LED。

那么,驅(qū)動(dòng)層代碼從哪里來呢?

如果是比較簡(jiǎn)單的外設(shè),比如LED,按鍵這種,只使用了GPIO,可以直接使用STM32CubeMX生成的gpio.c文件和gpio.h文件;

如果是比較復(fù)雜的外設(shè),比如LCD的底層是使用SPI驅(qū)動(dòng)的,那么除了 STM32CubeMX 生成的spi.hspi.c文件,還需要自己在此基礎(chǔ)上手寫LCD屏幕的驅(qū)動(dòng)文件,具體的教程可以參考我的裸機(jī)教程系列:STM32CubeMX教程。

3. 如何移植驅(qū)動(dòng)到LiteOS

復(fù)制裸機(jī)驅(qū)動(dòng)文件

LiteOS 工程 target 目錄結(jié)構(gòu)如下:

LiteOS驅(qū)動(dòng)移植方法是什么

其中和設(shè)備驅(qū)動(dòng)相關(guān)的有三個(gè)文件夾:

  • Inc:對(duì)應(yīng)STM32CubeMX生成裸機(jī)工程中的Inc

  • Src: 對(duì)應(yīng)STM32CubeMX生成裸機(jī)工程中的Src

  • Hardware:存放自己編寫的設(shè)備驅(qū)動(dòng)代碼

復(fù)制文件的時(shí)候按照情況復(fù)制到對(duì)應(yīng)的文件夾即可。

這里L(fēng)ED相關(guān)的代碼文件只有gpio.hgpio.c,所以復(fù)制gpio.h到 Inc 文件夾,復(fù)制gpio.c到 Src 文件夾。

使用IoT-Studio創(chuàng)建的HelloWorld工程中已經(jīng)提供好了這兩個(gè)文件,了解這個(gè)操作即可,不用再次復(fù)制。

添加裸機(jī)驅(qū)動(dòng)文件路徑

因?yàn)?LiteOS 的整個(gè)項(xiàng)目工程使用 make 構(gòu)建,所以復(fù)制驅(qū)動(dòng)文件之后,需要添加驅(qū)動(dòng)文件的路徑到 makefile 中,加入編譯。

project.mk文件指明了工程中所有文件的路徑:

LiteOS驅(qū)動(dòng)移植方法是什么

在該文件中:

  • C文件路徑

    • HARDWARE_SRC:對(duì)應(yīng)Hardware文件夾下的Src文件夾

    • USER_SRC:對(duì)應(yīng)Src文件夾

  • 頭文件路徑

    • HARDWARE_INC:對(duì)應(yīng)Hardware文件夾下的Inc文件夾

    • USER_INC:對(duì)應(yīng)Inc文件夾

如下,LED驅(qū)動(dòng)的gpio.c文件添加到USER_SRC下(工程中默認(rèn)已添加,無需重復(fù)添加):

LiteOS驅(qū)動(dòng)移植方法是什么

LED驅(qū)動(dòng)的gpio.h文件添加到USER_INC下(工程中默認(rèn)已添加,無需重復(fù)添加):

LiteOS驅(qū)動(dòng)移植方法是什么

至此,復(fù)制文件到LiteOS工程中,并將新復(fù)制的文件路徑添加到makefile中,加入工程編譯,就完成了驅(qū)動(dòng)的移植。

4. 外設(shè)驅(qū)動(dòng)文件的使用

初始化外設(shè)

在使用外設(shè)之前,首先需要初始化外設(shè),在LiteOS中,初始化設(shè)備有兩種方式:

  • 在系統(tǒng)啟動(dòng)調(diào)度之前初始化:設(shè)備在系統(tǒng)中隨時(shí)可被任意任務(wù)使用

  • 在任務(wù)中初始化:設(shè)備一般只在該任務(wù)中被使用

舉個(gè)例子:

像LED這種的驅(qū)動(dòng),一般都是任意的任務(wù)需要點(diǎn)亮或者關(guān)閉LED,沒有專門的LED點(diǎn)亮任務(wù)或者關(guān)閉任務(wù),在系統(tǒng)啟動(dòng)調(diào)度之前初始化比較好;

像光照強(qiáng)度傳感器這種驅(qū)動(dòng),一般都是有專門的數(shù)據(jù)采集任務(wù),專門去讀取傳感器數(shù)據(jù),不需要?jiǎng)e的線程去調(diào)用驅(qū)動(dòng)讀取數(shù)據(jù),所以放在該數(shù)據(jù)采集任務(wù)中初始化就可以。

在任務(wù)中調(diào)用初始化API比較簡(jiǎn)單,那么,如何在系統(tǒng)啟動(dòng)之前調(diào)用初始化API呢?

其實(shí),答案就在 Src 文件夾下的main.c中,main函數(shù)如下:

LiteOS驅(qū)動(dòng)移植方法是什么

可以看到,系統(tǒng)上電后首先調(diào)用 HardWare_Init 函數(shù)初始化硬件設(shè)備,然后初始化內(nèi)核,初始化shell,最后啟動(dòng)LOS內(nèi)核。

同樣在main.c中存放著HardWare_Init函數(shù)的實(shí)現(xiàn),來一探究竟:

LiteOS驅(qū)動(dòng)移植方法是什么

怎么樣?有沒有驚喜?是不是和裸機(jī)工程的main函數(shù)開始部分一模一樣?

我們可以將初始化函數(shù)盡情的扔到這個(gè)函數(shù)里,比如LED的初始化函數(shù)MX_GPIO_Init(),在系統(tǒng)上電的時(shí)候自動(dòng)將LED初始化,是不是很爽。

修復(fù)gpio.c文件中的小bug

在IoT Studio默認(rèn)提供的gpio.c文件的MX函數(shù)中,沒有對(duì) LED 的引腳 PC13 進(jìn)行初始化,手動(dòng)添加如下的初始化代碼:

LiteOS驅(qū)動(dòng)移植方法是什么

操作外設(shè)

接下來首先創(chuàng)建一個(gè)文件夾,用于存放本系列教程實(shí)驗(yàn)的代碼:

LiteOS驅(qū)動(dòng)移植方法是什么

LiteOS驅(qū)動(dòng)移植方法是什么

在該文件夾中創(chuàng)建一個(gè)文件:

LiteOS驅(qū)動(dòng)移植方法是什么

編寫代碼:

#include <osal.h>
#include <gpio.h>

static int led_blink_entry()
{
    while (1)
    {
        HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
        osal_task_sleep(1*1000);
    }
}

int standard_app_demo_main()
{
    osal_task_create("led_blink",led_blink_entry,NULL,0x400,NULL,2);
    return 0;
}

然后按照之前的方法,在 user_demo.mk 中將led_driver_demo.c文件添加到makefile中,加入編譯:

LiteOS驅(qū)動(dòng)移植方法是什么

最后在.sdkconfig中配置開啟宏定義:

LiteOS驅(qū)動(dòng)移植方法是什么

編譯,燒錄,即可看到LED開始閃爍:

LiteOS驅(qū)動(dòng)移植方法是什么

到此,相信大家對(duì)“LiteOS驅(qū)動(dòng)移植方法是什么”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

分享標(biāo)題:LiteOS驅(qū)動(dòng)移植方法是什么
網(wǎng)頁鏈接:http://bm7419.com/article32/pcicsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、手機(jī)網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)網(wǎng)站排名、營(yíng)銷型網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計(jì)