国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

【物聯(lián)網(wǎng)智能網(wǎng)關(guān)-17】.NET Micro Framework之MDK C++二次開(kāi)發(fā)

2019-11-17 03:23:59
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

【物聯(lián)網(wǎng)智能網(wǎng)關(guān)-17】.NET Micro Framework之MDK C++二次開(kāi)發(fā)

.NET Micro Framework雖然好學(xué)易用,但是在一些需要實(shí)時(shí),需要高性能的應(yīng)用領(lǐng)域,卻有些勉為其難。畢竟.NET Micro Framework上層應(yīng)用程序由底層CLR(TinyCLR)解釋執(zhí)行,執(zhí)行效率被打個(gè)折扣是在所難免的。

美國(guó)GHI公司(國(guó)外.NET Micro Framework硬件產(chǎn)品主要生廠商)為此提供了一個(gè)稱為RLP方案(https://www.ghielectronics.com/docs/50/rlp-enhanced)。可以讓.NET Micro Framework的應(yīng)用程序調(diào)用MDK編寫的C++程序,主要是解決性能問(wèn)題,把一些比較運(yùn)行比較耗時(shí)的代碼采用C++完成,功能相對(duì)簡(jiǎn)單。

而我們所提供的方案和他們不同,我們是通過(guò)流式驅(qū)動(dòng)的方式用MDK開(kāi)發(fā)C++程序。用戶程序采用標(biāo)準(zhǔn)的流式驅(qū)動(dòng)接口進(jìn)行相關(guān)調(diào)用。并且流式驅(qū)動(dòng)提供事件機(jī)制,底層和上層可以通過(guò)事件進(jìn)行交互。

另外就是為MDK C++程序提供了豐富的.NET Micro Framework PAL層接口,可以讓用戶隨心所欲地開(kāi)發(fā)出功能強(qiáng)大的程序。

在此之前我已經(jīng)寫過(guò)兩篇相關(guān)的文章,用戶可以先行了解一下:《.NET Micro Framework動(dòng)態(tài)調(diào)用C/C++底層代碼(原理篇)》和《【物聯(lián)網(wǎng)智能網(wǎng)關(guān)-11】流式驅(qū)動(dòng)之用戶驅(qū)動(dòng)(MDK C++開(kāi)發(fā))》。

和上一篇文章介紹的功能函數(shù)相比,又?jǐn)U展了一些比較實(shí)用的功能,比如I2C、SPI接口,底層中斷打開(kāi)關(guān)閉,HAL_COMPLETION、HAL_CONTINUATION類似底層多線程支持和中斷程序用戶態(tài)執(zhí)行,功能函數(shù)由原來(lái)的61個(gè)擴(kuò)展到了80個(gè)。具體功能接口如下:

struct IGeneralStream_Function{  INT32  iparam1;  LPCSTR sParam1;   //---  void (*Notice_GenerateEvent)(UINT32 data1, UINT32 data2);  void (*lcd_PRintf)(char const * format,...);  void (*debug_printf)(char const* format, ... );  void (*HAL_Time_Sleep_MicroSeconds_InterruptEnabled)(UINT32 uSec);  UINT32 (*Events_WaitForEvents)(UINT32 WakeupSystemEvents, UINT32 Timeout_Milliseconds);  void (*disable_interrupts)();  void (*enable_interrupts)();  void* (*private_malloc)(size_t len);  void  (*private_free)( void*  ptr);  //--- lock ---  BOOL (*DISABLE_INTERRUPTS)(void* context);  BOOL (*ENABLE_INTERRUPTS)(void* context);   //HAL_COMPLETION/HAL_CONTINUATION  UINT32 (*HAL_COMPLETION_Initialize)(HAL_CALLBACK_FPN EntryPoint,void* Argument);  void (*HAL_COMPLETION_Uninitialize)(UINT32 handle);  void (*HAL_COMPLETION_EnqueueDelta)(UINT32 handle,UINT32 uSec);  UINT32 (*HAL_CONTINUATION_Initialize)(HAL_CALLBACK_FPN EntryPoint,void* Argument);  void (*HAL_CONTINUATION_Uninitialize)(UINT32 handle);  void (*HAL_CONTINUATION_Enqueue)(UINT32 handle);   //--- mem ---  int (*hal_snprintf)( char* buffer, size_t len, const char* format, ... );  int (*hal_stricmp)( const char * dst, const char * src );  int (*hal_strncmp_s)( const char* str1, const char* str2, size_t num );  size_t (*hal_strlen_s)(const char * str);            void *(*memcpy)(void * dst, const void * src, size_t len);  void *(*memset)( void * dst, int value, size_t len );     //--- Flash ---  INT32 (*Yfsoft_Flash_Erase)( UINT32 address, UINT32 count);  INT32 (*YFSoft_Flash_Read)( UINT32 address, UINT32 count,UINT8 *buffer);  INT32 (*YFSoft_Flash_Write)( UINT32 address, UINT32 count,UINT8 *buffer);   //--- GPIO ---  void (*CPU_GPIO_DisablePin)(GPIO_PIN Pin, GPIO_RESISTOR ResistorState, UINT32 Direction, GPIO_ALT_MODE AltFunction);  BOOL (*CPU_GPIO_EnableInputPin)(GPIO_PIN Pin, BOOL GlitchFilterEnable, GPIO_INTERRUPT_SERVICE_ROUTINE ISR, GPIO_INT_EDGE IntEdge, GPIO_RESISTOR ResistorState);  void (*CPU_GPIO_EnableOutputPin)(GPIO_PIN Pin, BOOL InitialState);  BOOL (*CPU_GPIO_GetPinState)(GPIO_PIN Pin);  void (*CPU_GPIO_SetPinState)(GPIO_PIN Pin, BOOL PinState);   //--- TIMER ---  BOOL (*CPU_TIMER_Initialize)(UINT32 timer, UINT32 ARR,UINT16 PSC,HAL_CALLBACK_FPN ISR, void* ISR_Param );  BOOL (*CPU_TIMER_Uninitialize)(UINT32 timer );  void (*CPU_TIMER_Start)(UINT32 timer);  void (*CPU_TIMER_Stop)(UINT32 timer);    UINT32 (*CPU_TIMER_GetState)(UINT32 timer);  void (*CPU_TIMER_SetState)(UINT32 timer,UINT32 state);   //--- USART ---    BOOL (*USART_Initialize)( int ComPortNum, int BaudRate, int Parity, int DataBits, int StopBits, int FlowValue );  BOOL (*USART_Uninitialize)( int ComPortNum );  int  (*USART_Write)( int ComPortNum, const char* Data, size_t size );  int  (*USART_Read)( int ComPortNum, char* Data, size_t size );  BOOL (*USART_Flush)( int ComPortNum );  int  (*USART_BytesInBuffer)( int ComPortNum, BOOL fRx );  void (*USART_DiscardBuffer)( int ComPortNum, BOOL fRx );   //--- AD/DA ---  BOOL (*DA_Initialize)( ANALOG_CHANNEL channel, INT32 precisionInBits );  void (*DA_Write)( ANALOG_CHANNEL channel, INT32 level );  BOOL (*AD_Initialize)( ANALOG_CHANNEL channel, INT32 precisionInBits );  INT32 (*AD_Read)( ANALOG_CHANNEL channel );   //--- PWM ----  BOOL (*PWM_Initialize)( PWM_CHANNEL channel );  BOOL (*PWM_Uninitialize)( PWM_CHANNEL channel );  BOOL (*PWM_ApplyConfiguration)( PWM_CHANNEL channel, GPIO_PIN pin, UINT32& period, UINT32& duration, PWM_SCALE_FACTOR &scale, BOOL invert );  BOOL (*PWM_Start)( PWM_CHANNEL channel, GPIO_PIN pin );  void (*PWM_Stop)( PWM_CHANNEL channel, GPIO_PIN pin );  GPIO_PIN (*PWM_GetPinForChannel)( PWM_CHANNEL channel );   //--- SPI ----  BOOL (*CPU_SPI_nWrite16_nRead16)( const SPI_CONFIGURATION& Configuration, UINT16* Write16, INT32 WriteCount, UINT16* Read16, INT32 ReadCount, INT32 ReadStartOffset );  BOOL (*CPU_SPI_nWrite8_nRead8)( const SPI_CONFIGURATION& Configuration, UINT8* Write8, INT32 WriteCount, UINT8* Read8, INT32 ReadCount, INT32 ReadStartOffset );   //--- I2C ----  BOOL (*I2C_Initialize)();  BOOL (*I2C_Uninitialize)();  BOOL (*I2C_Execute)(UINT16 address,UINT8 *inBuffer,int inCount,UINT8 *outBuffer,int outCount,UINT32 clockRateKhz,int timeout);   //--- TinyGUI ----  void (*LCD_ClearEx)(UINT32 color);     void (*LCD_SetPixel)(INT32 x,INT32 y,UINT32 color);  UINT32 (*LCD_GetPixel)(INT32 x,INT32 y);  void (*LCD_DrawLine)(INT32 x1,INT32 y1,INT32 x2,INT32 y2,UINT32 color);  void (*LCD_DrawRectangle)(INT32 x,INT32 y,INT32 width,INT32 height,UINT32 color);  void (*LCD_DrawEllipse)(INT32 x,INT32 y,INT32 width,INT32 height,UINT32 color);  void (*LCD_DrawImage)(INT32 x,INT32 y,UINT8 *bytData);  void (*LCD_DrawImageEx)(INT32 x,INT32 y,UINT8 *bytData,UINT32 MaskColor);  void (*LCD_DrawString)(INT32 x,INT32 y,LPCSTR s,UINT32 color);  void (*LCD_DrawStringEx)(INT32 x,INT32 y,UINT32 color,UINT8 *fontdata,int width,int height,int count); //2012-08-06  void (*LCD_FillRectangle)(INT32 x,INT32 y,INT32 width,INT32 height,UINT32 color);  void (*LCD_FillEllipse)(INT32 x,INT32 y,INT32 width,INT32 height,UINT32 color);  void (*LCD_GetFrameBufferEx)(UINT8 *bytData,UINT32 offset,UINT32 size);  void (*LCD_SuspendLayout)();  void (*LCD_ResumeLayout)();  };

下面簡(jiǎn)單介紹一下驅(qū)動(dòng)開(kāi)發(fā)步驟。

1、 在MDK 4.xx版本創(chuàng)建一個(gè)新項(xiàng)目,添加generalstream.h頭文件,然后再添加模板文件UserDriver.cpp。如下圖所示:

2、 選定MCU類型,可以根據(jù)實(shí)際硬件選擇STM32F103/STM32F207/STM32F407/STM32F405。

(凌霄智能終端采用的芯片就是STM32F405RG)

3、 輸入對(duì)應(yīng)的平臺(tái)宏定義

4、 配置針對(duì)具體硬件所設(shè)置的離散加載配置文件

凌霄智能終端的離散加載文件的內(nèi)容如下:

LR_IROM1 0x08010000 0x00010000 { ; load region size_region

ER_IROM1 0x08010000 0x00010000 { ; load address = execution address

.ANY (+RO)

}

RW_IRAM1 0x20000400 0x00002000 { ; RW data

.ANY (+RW +ZI)

}

}

表示程序加載的位置在0x08010000,大小為64K,RAM空間為0x20000400起始的8K空間。

注:用戶驅(qū)動(dòng)除了這部分RAM可用外,還可以直接通過(guò)接口提供的內(nèi)存操作函數(shù),分配堆上的內(nèi)存。

5、 編寫用戶驅(qū)動(dòng)(C/C++),下面是一個(gè)綜合示例,用到了GPIO操作、顯示操作、時(shí)鐘中斷操作和事件通知。

#include "GeneralStream.h"http://--//#if defined(YF_Campsis103) || defined(YF_Campsis405)#define COM_PORT  COM1#else#define COM_PORT  COM3#endifvolatile UINT32 Num;void TIMER_ISR(void* param){#if defined(YF_Campsis103) || defined(YF_Campsis405)   MF->CPU_GPIO_SetPinState(PC0,!MF->CPU_GPIO_GetPinState(PC0));#else   MF->CPU_GPIO_SetPinState(PF6,!MF->CPU_GPIO_GetPinState(PF6));#endif   MF->CPU_TIMER_SetState(TIM3,0);   if(Num++>30)   {      Num=0;      //觸發(fā)事件      MF->Notice_GenerateEvent(UserDriver_Hander,123);   }}//--// //Open1永遠(yuǎn)也不會(huì)被調(diào)用int GeneralStream_Open1_UserDriver(LPCSTR config) {   return 0;}    int GeneralStream_Open2_UserDriver(int config){  //獲取系統(tǒng)函數(shù)的指針  MF = (IGeneralStream_Function*)config;  //C#下傳的參數(shù)  //MF->lcd_printf("%d,%s/r/n",MF->iParam1,MF->sParam1);  MF->debug_printf("%d,%s/r/n",MF->iParam1,MF->sParam1);    //初始化LED燈#if defined(YF_Campsis103) || defined(YF_Campsis405)  MF->CPU_GPIO_EnableOutputPin(PC0,TRUE); #else  MF->CPU_GPIO_EnableOutputPin(PF6,TRUE);  MF->CPU_GPIO_EnableOutputPin(PF7,TRUE);  MF->CPU_GPIO_EnableO
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 理塘县| 东台市| 锡林浩特市| 淳安县| 西乡县| 确山县| 巫山县| 厦门市| 许昌市| 东兰县| 武平县| 乐山市| 襄垣县| 天全县| 子洲县| 江城| 景谷| 斗六市| 南阳市| 胶州市| 巴东县| 利津县| 甘南县| 晋州市| 专栏| 天水市| 东安县| 泰和县| 巴东县| 雷州市| 芦溪县| 苗栗县| 永城市| 抚顺市| 鹤峰县| 青浦区| 涟水县| 桐庐县| 屏东市| 南乐县| 新晃|