程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 【物聯網智能網關-17】.NET Micro Framework之MDK C++二次開發

【物聯網智能網關-17】.NET Micro Framework之MDK C++二次開發

編輯:C#入門知識

.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#)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved