MCU項(xiàng)目如何實(shí)現(xiàn)應(yīng)用和硬件分層管理_第1頁
MCU項(xiàng)目如何實(shí)現(xiàn)應(yīng)用和硬件分層管理_第2頁
MCU項(xiàng)目如何實(shí)現(xiàn)應(yīng)用和硬件分層管理_第3頁
MCU項(xiàng)目如何實(shí)現(xiàn)應(yīng)用和硬件分層管理_第4頁
MCU項(xiàng)目如何實(shí)現(xiàn)應(yīng)用和硬件分層管理_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

現(xiàn)在做項(xiàng)目,需求更復(fù)雜了,自然對(duì)項(xiàng)目的要求比以前更嚴(yán)格了。站在技術(shù)的角度,還是建議大家平時(shí)做項(xiàng)目要做到(應(yīng)用和驅(qū)動(dòng))分層,這樣不僅僅方便維護(hù)、移植項(xiàng)目,更重要的是提高自己技術(shù)的水平。今天就給大家分享一個(gè)開源的、輕量級(jí)的管理模塊:cola_os一、概述以STM32為例,打開網(wǎng)絡(luò)上下載的例程或者是購買開發(fā)板自帶的例程,都會(huì)發(fā)現(xiàn)應(yīng)用層中會(huì)有stm32f10x.h或者stm32f10x_gpio.h,這些文件嚴(yán)格來時(shí)屬于硬件層的,如果軟件層出現(xiàn)這些文件會(huì)顯得很亂。使用過Linux的童鞋們肯定知道linux系統(tǒng)無法直接操作硬件層,打開linux或者rt_thread代碼會(huì)發(fā)現(xiàn)代碼中都會(huì)有device的源文件,沒錯(cuò),這就是驅(qū)動(dòng)層。二、實(shí)現(xiàn)原理原理就是將硬件操作的接口全都放到驅(qū)動(dòng)鏈表上,在驅(qū)動(dòng)層實(shí)現(xiàn)device的open、read、write等操作。當(dāng)然這樣做也有弊端,就是驅(qū)動(dòng)find的時(shí)候需要遍歷一遍驅(qū)動(dòng)鏈表,這樣會(huì)增加代碼運(yùn)行時(shí)間。三、代碼實(shí)現(xiàn)國際慣例,寫代碼先寫頭文件。rt_thread中使用的是雙向鏈表,為了簡(jiǎn)單在這我只用單向鏈表。有興趣的可以自行研究rt_thread頭文件接口:本次只實(shí)現(xiàn)如下接口,device_open和device_close等剩下的接口可以自行研究。這樣就可以在應(yīng)用層中只調(diào)用如下接口可實(shí)現(xiàn):/*驅(qū)動(dòng)注冊(cè)*/intcola_device_register(cola_device_t*dev);/*驅(qū)動(dòng)查找*/cola_device_t*cola_device_find(constchar*name);/*驅(qū)動(dòng)讀*/intcola_device_read(cola_device_t*dev,intpos,void*buffer,intsize);/*驅(qū)動(dòng)寫*/intcola_device_write(cola_device_t*dev,intpos,constvoid*buffer,intsize);/*驅(qū)動(dòng)控制*/intcola_device_ctrl(cola_device_t*dev,intcmd,void*arg);;頭文件cola_device.h:#ifndef_COLA_DEVICE_H_#define_COLA_DEVICE_H_enumLED_state{LED_OFF,LED_ON,LED_TOGGLE,};typedefstructcola_devicecola_device_t;structcola_device_ops{int(*init)(cola_device_t*dev);int(*open)(cola_device_t*dev,intoflag);int(*close)(cola_device_t*dev);int(*read)(cola_device_t*dev,intpos,void*buffer,intsize);int(*write)(cola_device_t*dev,intpos,constvoid*buffer,intsize);int(*control)(cola_device_t*dev,intcmd,void*args);};structcola_device{constchar*name;structcola_device_ops*dops;structcola_device*next;};/*驅(qū)動(dòng)注冊(cè)*/intcola_device_register(cola_device_t*dev);/*驅(qū)動(dòng)查找*/cola_device_t*cola_device_find(constchar*name);/*驅(qū)動(dòng)讀*/intcola_device_read(cola_device_t*dev,intpos,void*buffer,intsize);/*驅(qū)動(dòng)寫*/intcola_device_write(cola_device_t*dev,intpos,constvoid*buffer,intsize);/*驅(qū)動(dòng)控制*/intcola_device_ctrl(cola_device_t*dev,intcmd,void*arg);#endif源文件cola_device.c:#include"cola_device.h"#include<string.h>#include<stdbool.h>structcola_device*device_list=NULL;/*查找任務(wù)是否存在*/staticboolcola_device_is_exists(cola_device_t*dev){cola_device_t*cur=device_list;while(cur!=NULL){if(strcmp(cur->name,dev->name)==0){returntrue;}cur=cur->next;}returnfalse;}staticintdevice_list_inster(cola_device_t*dev){cola_device_t*cur=device_list;if(NULL==device_list){device_list=dev;dev->next=NULL;}else{while(NULL!=cur->next){cur=cur->next;}cur->next=dev;dev->next=NULL;}return1;}/*驅(qū)動(dòng)注冊(cè)*/intcola_device_register(cola_device_t*dev){if((NULL==dev)||(cola_device_is_exists(dev))){return0;}if((NULL==dev->name)||(NULL==dev->dops)){return0;}returndevice_list_inster(dev);}/*驅(qū)動(dòng)查找*/cola_device_t*cola_device_find(constchar*name){cola_device_t*cur=device_list;while(cur!=NULL){if(strcmp(cur->name,name)==0){returncur;}cur=cur->next;}returnNULL;}/*驅(qū)動(dòng)讀*/intcola_device_read(cola_device_t*dev,intpos,void*buffer,intsize){if(dev){if(dev->dops->read){returndev->dops->read(dev,pos,buffer,size);}}return0;}/*驅(qū)動(dòng)寫*/intcola_device_write(cola_device_t*dev,intpos,constvoid*buffer,intsize){if(dev){if(dev->dops->write){returndev->dops->write(dev,pos,buffer,size);}}return0;}/*驅(qū)動(dòng)控制*/intcola_device_ctrl(cola_device_t*dev,intcmd,void*arg){if(dev){if(dev->dops->control){returndev->dops->control(dev,cmd,arg);}}return0;}硬件注冊(cè)方式:以LED為例,初始化接口voidled_register(void),需要在初始化中調(diào)用。#include"stm32f0xx.h"#include"led.h"#include"cola_device.h"#definePORT_GREEN_LEDGPIOC#definePIN_GREENLEDGPIO_Pin_13/*LED亮、滅、變化*/#defineLED_GREEN_OFF(PORT_GREEN_LED->BSRR=PIN_GREENLED)#defineLED_GREEN_ON(PORT_GREEN_LED->BRR=PIN_GREENLED)#defineLED_GREEN_TOGGLE(PORT_GREEN_LED->ODR^=PIN_GREENLED)staticcola_device_tled_dev;staticvoidled_gpio_init(void){GPIO_InitTypeDefGPIO_InitStructure;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC,ENABLE);GPIO_InitStructure.GPIO_Pin=PIN_GREENLED;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;GPIO_Init(PORT_GREEN_LED,&GPIO_InitStructure);LED_GREEN_OFF;}staticintled_ctrl(cola_device_t*dev,intcmd,void*args){if(LED_TOGGLE==cmd){LED_GREEN_TOGGLE;}else{}return1;}staticstructcola_device_opsops={.control=led_ctrl,};voidled_register(void){led_gpio_init();led_dev.dops=&ops;led_="led";cola_device_register(&led_dev);}應(yīng)用層app代碼:#include<string.h>#include"app.h"#include"config.h"#include"cola_device.h"#include"cola_os.h"statictask_ttimer_500ms;staticcola_device_t*app_led_dev;//led每500ms狀態(tài)改變一次staticvoidtimer_500ms_cb(uin

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論