.NET Micro Framework雖然好學易用,但是在一些需要實時,需要高性能的應用領域,卻有些勉為其難。畢竟.NET Micro Framework上層應用程序由底層CLR(TinyCLR)解釋執行,執行效率被打個折扣是在所難免的。
美國GHI公司(國外.NET Micro Framework硬件產品主要生廠商)為此提供了一個稱為RLP方案(https://www.ghielectronics.com/docs/50/rlp-enhanced)。可以讓.NET Micro Framework的應用程序調用MDK編寫的C++程序,主要是解決性能問題,把一些比較運行比較耗時的代碼采用C++完成,功能相對簡單。
而我們所提供的方案和他們不同,我們是通過流式驅動的方式用MDK開發C++程序。用戶程序采用標准的流式驅動接口進行相關調用。並且流式驅動提供事件機制,底層和上層可以通過事件進行交互。
另外就是為MDK C++程序提供了豐富的.NET Micro Framework PAL層接口,可以讓用戶隨心所欲地開發出功能強大的程序。
在此之前我已經寫過兩篇相關的文章,用戶可以先行了解一下:《.NET Micro Framework動態調用C/C++底層代碼(原理篇)》和《【物聯網智能網關-11】流式驅動之用戶驅動(MDK C++開發)》。
和上一篇文章介紹的功能函數相比,又擴展了一些比較實用的功能,比如I2C、SPI接口,底層中斷打開關閉,HAL_COMPLETION、HAL_CONTINUATION類似底層多線程支持和中斷程序用戶態執行,功能函數由原來的61個擴展到了80個。具體功能接口如下:
(* (*lcd_printf)( * (*debug_printf)( * (** (* (** (* (*private_free)( * *DISABLE_INTERRUPTS)(**ENABLE_INTERRUPTS)(* *HAL_COMPLETION_Initialize)(HAL_CALLBACK_FPN EntryPoint,* (* (**HAL_CONTINUATION_Initialize)(HAL_CALLBACK_FPN EntryPoint,* (* (* (*hal_snprintf)( * buffer, size_t len, * (*hal_stricmp)( * dst, * (*hal_strncmp_s)( * str1, **hal_strlen_s)( * *(*memcpy)( * dst, * *(*memset)( * dst, **YFSoft_Flash_Read)( UINT32 address, UINT32 count,UINT8 **YFSoft_Flash_Write)( UINT32 address, UINT32 count,UINT8 * (** (** (* *CPU_TIMER_Initialize)(UINT32 timer, UINT32 ARR,UINT16 PSC,HAL_CALLBACK_FPN ISR, ** (* (** (* *USART_Initialize)( ComPortNum, BaudRate, Parity, DataBits, StopBits, *USART_Uninitialize)( (*USART_Write)( ComPortNum, * (*USART_Read)( ComPortNum, **USART_Flush)( (*USART_BytesInBuffer)( (*USART_DiscardBuffer)( * (*** ***PWM_ApplyConfiguration)( PWM_CHANNEL channel, GPIO_PIN pin, UINT32& period, UINT32& duration, PWM_SCALE_FACTOR &* (** *CPU_SPI_nWrite16_nRead16)( SPI_CONFIGURATION& Configuration, UINT16* Write16, INT32 WriteCount, UINT16**CPU_SPI_nWrite8_nRead8)( SPI_CONFIGURATION& Configuration, UINT8* Write8, INT32 WriteCount, UINT8* ***I2C_Execute)(UINT16 address,UINT8 *inBuffer, inCount,UINT8 *outBuffer, outCount,UINT32 clockRateKhz, (* (** (* (* (* (*LCD_DrawImage)(INT32 x,INT32 y,UINT8 * (*LCD_DrawImageEx)(INT32 x,INT32 y,UINT8 * (* (*LCD_DrawStringEx)(INT32 x,INT32 y,UINT32 color,UINT8 *fontdata, width, height, count); (* (* (*LCD_GetFrameBufferEx)(UINT8 * (* (*
下面簡單介紹一下驅動開發步驟。
1、 在MDK 4.xx版本創建一個新項目,添加generalstream.h頭文件,然後再添加模板文件UserDriver.cpp。如下圖所示:
2、 選定MCU類型,可以根據實際硬件選擇STM32F103/STM32F207/STM32F407/STM32F405。
(凌霄智能終端采用的芯片就是STM32F405RG)
3、 輸入對應的平台宏定義
4、 配置針對具體硬件所設置的離散加載配置文件
凌霄智能終端的離散加載文件的內容如下:
LR_IROM1 0x08010000 0x00010000 { ; load region size_region
ER_IROM1 0x08010000 0x00010000 { ; load address = execution address
}
RW_IRAM1 0x20000400 0x00002000 { ; RW data
.ANY (+RW +ZI)
}
}
表示程序加載的位置在0x08010000,大小為64K,RAM空間為0x20000400起始的8K空間。
注:用戶驅動除了這部分RAM可用外,還可以直接通過接口提供的內存操作函數,分配堆上的內存。
5、 編寫用戶驅動(C/C++),下面是一個綜合示例,用到了GPIO操作、顯示操作、時鐘中斷操作和事件通知。
#include defined(YF_Campsis103) || defined(YF_Campsis405) COM_PORT COM1 COM_PORT COM3 TIMER_ISR(* defined(YF_Campsis103) || defined(YF_Campsis405)->CPU_GPIO_SetPinState(PC0,!MF->->CPU_GPIO_SetPinState(PF6,!MF->->CPU_TIMER_SetState(TIM3,(Num++>= MF->Notice_GenerateEvent(UserDriver_Hander, GeneralStream_Open2_UserDriver( MF = (IGeneralStream_Function* MF->debug_printf(,MF->iParam1,MF-> defined(YF_Campsis103) || defined(YF_Campsis405)->->->-> Num = ->CPU_TIMER_Initialize(TIM3,,(SYSTEM_TIM_CLOCK_HZ/--> MF->USART_Initialize(COM_PORT,,USART_PARITY_NONE, MF->->LCD_DrawString(,, GeneralStream_IOControl1_UserDriver( code, BYTE *inBuffer, inCount, BYTE *outBuffer, - GeneralStream_IOControl2_UserDriver( code, data[]={,,->USART_Write(COM_PORT, data, ->lcd_printf(->debug_printf( str[->hal_snprintf(str,,->LCD_FillRectangle(,,,->LCD_DrawString(, defined(YF_Wisteria207) || defined(YF_Wisteria407)->CPU_GPIO_SetPinState(PF7,! MF->->CPU_GPIO_SetPinState(PF8,! MF-> code+ GeneralStream_Read_UserDriver(BYTE *buffer, offset, - GeneralStream_Write_UserDriver(BYTE *buffer, offset, - main( IGeneralStream_Function *MF= IGeneralStream g_GeneralStream_UserDriver __attribute__ ((at(IGeneralStream_Address))) =&&&&&&&
7、 采用YFAccessFlash部署UserDriver.bin文件。
選定UserDriver.bin文件然後直接部署即可。
注:如果這不是初次部署運行用戶驅動,需要先終止當前程序的執行,否則部署會出現問題(凌霄103的設備需要先部署應用,然後再部署用戶驅動)。
8、 用戶程序編寫(C#)