淺談嵌入式MCU軟體開發之利用Cortex-M內核的DWT模塊的內核周期計數器測量S32K14xMCU的應用代碼執行時間

2021-01-15 汽車電子expert成長之路

內容提要

1. ARM Cortex-M內核的DWT功能特性和應用代碼執行時間測量原理介紹2. Bare-Metal實現S32K144應用工程代碼執行時間測量實現2. 1 定義Cortex-M內核的DWT模塊訪問寄存器3. 基於FreeRTOS的S32K144應用工程代碼執行時間測量實現3.1 FreeRTOS的任務運行時間統計( Run Time Statistics)功能3.2 FreeRTOS還提供了擴展命令行接口(CLI--Command Line Interface)功能3.3 基於FreeRTOS的S32K144應用代碼運行時間統計實現


    引言


很多嵌入式MCU的用戶在選擇MCU時,想要評估一些實時性要求比較的關鍵代碼,比如三相電機控制的FOC算法執行時間,是否能夠滿足系統功能設計的要求。因此需要一種實用的方法來實現對特定應用代碼段和功能函數的執行時間進行精確測量,最容易想到的方法就是找一個高精度的硬體定時器來作為測量參考定時器,當然也可以使用一些高級的調試器,比如Lauterbach的跟蹤調試(trace)功能來做性能評估,但是具有跟蹤調試功能的調試器通常都比較昂貴,一般中小客戶不一定願意購買。因此,本文介紹一種基於ARM Cortex M4F內核數據監測點和跟蹤單元(DWT,Data Watchpoint and Trace uniit)的應用程式代碼執行時間測量方法,以及其在S32K14x系列MCU上的Bare-Metal和基於FreeRTOS運行時間統計功能的實現,供大家參考。1. ARM Cortex-M內核的DWT功能特性和應用代碼執行時間測量原理介紹在ARM Cortex M系列CPU內核(ARM Cotrex-M v7(CM3和CM4F及CM7)及v8架構(CM33, CM55等))中, 提供了數據監測點和跟蹤單元(DWT,Data Watchpoint and Trace uniit)以支持數據斷點功能(下圖為CM4內核的調試架構)。

數據監測點(即數據斷點),讓CPU內核進入調試狀態(debug state)或者產生一個調試監測器異常(DebugMonitor exception);

數據跟蹤(data tracing);

與其他調試資源(比如ETM模塊)一起使用產生調試信號;

內核程序計數器值跟蹤(PC value tracing)

內核周期計數匹配(cycle count matching)

② 額外的內核程序計數器採樣(PC Sampling)

PC採樣跟蹤輸出作為周期計數事件的結果

使用PC採樣寄存器的外部PC採樣

Note:NXP的S32K11x系列MCU使用的CM0+內核,雖然也包含DWT模塊,但是其功能比較簡單,不包含內周周期計數器,因此不能使用本文介紹的基於DWT的應用代碼執行時間測量方法。ARM Cotrex-M v6(CM0+)中DWT模塊功能和寄存器如下:


在ARM Cotrex-M v7(CM3和CM4F及CM7)及v8架構(CM33, CM55等)中DWT模塊提供了如下寄存器:

DWT模塊的控制寄存器(DWT_CTRL)最低位(CYCCNTENA)用於使能DWT模塊周期計數器(CYCCNT),復位後默認為0,將其置1即可使能DWT模塊周期計數器(CYCCNT):

DWT模塊的周期計數寄存器(DWT_CYCCNT)保存著DWT模塊實現的32-bit的CPU內核周期計數器計算結果,通過配置DWT模塊(DWT_CTRL[CYCNTENA] = 1)並使能內核跟蹤調試功能 (DEMCR[TRCENA] = 1)即可使能該計數器。

其中,調試異常和檢查控制寄存器(DEMCR)的TRCENA(bit-24)為DWT和ITM模塊的全局使能控制位,使用DWT模式時,首先需要將其置1:

Tips:關於ARM Cortex-M系列CPU內核的細節,可以參考如下公眾號文章(直接點擊文章標題即可跳轉閱讀):由於CPU內核的工作頻率,在MCU系統時鐘初始化時即可確定,比如S32K14x系列MCU在RUN模式時配置內核工作頻率(CORE_CLK)為80MHz。因此,我們只要能夠測量測量出應用代碼執行花費了多少內核時鐘周期,即可得到其執行時間。上面介紹的CM4內核DWT內核周期計數器(DWT_CYCCNT)是一個以內核時鐘頻率計數的硬體計數器,將其使能後,讀取應用代碼執行前後該計數器的值相減即可得到所花費的內核時鐘周期,進而計算代碼出執行時間。2. Bare-Metal實現S32K144應用工程代碼執行時間測量實現2. 1 定義Cortex-M內核的DWT模塊訪問寄存器為了對Cortex-M內核的DWT模塊進行讀寫訪問,需要按照ARM內核參考手冊定義其寄存器地址如下:
/**********************************************************************************                           CORTEX-M - DWT TIMER*********************************************************************************/
#define ARM_CM_DEMCR (*(uint32_t *)0xE000EDFC)#define ARM_CM_DWT_CTRL (*(uint32_t *)0xE0001000)#define ARM_CM_DWT_CYCCNT (*(uint32_t *)0xE0001004)


為了方便使用,定義如下數據結構以記錄代碼運行時間測量結果,其中包含測量開始時DWT定時器的計數器值、當前測量結果以及歷次測量統計的最大和最小結果:
/**********************************************************************************                             Measurement Result Data Structure*********************************************************************************/
typedef struct elapsed_time{ uint32_t start; /* DWT counter value at the measurement start point*/ uint32_t current; /* result of current measurement */ uint32_t max; /* the maximum measurement result */ uint32_t min; /* the minimum measurement result */} ELAPSED_TIME;

並定義了能夠保存最多10個(用戶可以通過宏定義根據實際測量需要修改)代碼執行時間測量結果的結構體數組:
#define  ELAPSED_TIME_MAX_SECTIONS  10static  ELAPSED_TIME  elapsed_time_tbl[ELAPSED_TIME_MAX_SECTIONS];

為了完成基於DWT定時器額應用代碼執行時間測量,定義了如下4個API函數:
void  elapsed_time_clr   (uint32_t  i);      void  elapsed_time_init  (void);             void  elapsed_time_start (uint32_t  i);      void  elapsed_time_stop  (uint32_t  i);      

具體實現代碼如下:

/**********************************************************************************                              MODULE INITIALIZATION** Note(s): Must be called before any of the other functions in this module*********************************************************************************/
void elapsed_time_init (void){ uint32_t i;
if (ARM_CM_DWT_CTRL != 0) /* check if DWT is available */ { ARM_CM_DEMCR |= 1 << 24; /* Set bit 24 */ ARM_CM_DWT_CYCCNT = 0; /* clean the DWT counter */ ARM_CM_DWT_CTRL |= 1 << 0; /* Set bit 0 */ }
/* clean all the measurement result */ for (i = 0; i < ELAPSED_TIME_MAX_SECTIONS; i++) { elapsed_time_clr(i); }}
/********************************************************************************** START THE MEASUREMENT OF A CODE SECTION*********************************************************************************/void elapsed_time_start (uint32_t i){ /* * get current DWT counter value and store it to elapsed time table * as the measurement start time */ elapsed_time_tbl[i].start = ARM_CM_DWT_CYCCNT;}
/********************************************************************************** STOP THE MEASUREMENT OF A CODE SECTION AND COMPUTE STATS*********************************************************************************/void elapsed_time_stop (uint32_t i){ uint32_t stop; ELAPSED_TIME *p_tbl;
stop = ARM_CM_DWT_CYCCNT; /* get current DWT counter value */ p_tbl = &elapsed_time_tbl[i]; /* get the elapsed time table for the measurement */
/* calculate the runtime measurement result */ p_tbl->current = stop - p_tbl->start;
/* find and record the maximum measurement result */ if (p_tbl->max < p_tbl->current) { p_tbl->max = p_tbl->current; }
/* find and record the minimum measurement result */ if (p_tbl->min > p_tbl->current) { p_tbl->min = p_tbl->current; }}
/********************************************************************************** CLEAR THE MEASUREMENTS STATS*********************************************************************************/void elapsed_time_clr (uint32_t i){ ELAPSED_TIME *p_tbl;
/* get the measurement result from the elapsed time table */ p_tbl = &elapsed_time_tbl[i];
p_tbl->start = 0; /*clean the start DWT counter value */ p_tbl->current = 0; /*clean the current measurement result */ p_tbl->min = 0xFFFFFFFF; /*clean the minimum measurement result */ p_tbl->max = 0; /*clean the maximum measurement result */}


在開始應用代碼執行時間測量之前,需要調用API函數elapsed_time_init()完成對WDT定時器的初始化(使能)和全局測量結果的清除。然後就可以調用API函數elapsed_time_start()啟動測量,在測量結束時調用API函數elapsed_time_stop()獲取測量結果即可:
elapsed_time_init();
elapsed_time_start(x);App_Func(); elapsed_time_stop(x);

如下測試代碼完了對系統初始化函數MCU_SystemInit()和FreeRTOS應用任務創建函數AppTasks_Create()執行時間的測量,相應的結果放在結果0和結果1中:
elapsed_time_init();
elapsed_time_start(0); MCU_SystemInit(); elapsed_time_stop(0);
elapsed_time_start(1); AppTasks_Create(); elapsed_time_stop(1);

實際測量結果如下(將elapsed_time_tbl數組添加到expression窗口中查看接口,當然,用戶也可以在應用代碼直接讀取elapsed_time_tbl數組,獲取結果):

3. 基於FreeRTOS的S32K144應用工程代碼執行時間測量實現在S32K1xx SDK中集成了移植好的FreeRTOS給S32K14x系列MCU使用。一方面,FreeRTOS提供了任務運行時間統計(Run Time Statistics)方便用戶進行FreeRTOS任務執行時間的測量和統計,另一方面,FreeRTOS還提供了擴展命令行接口(CLI--Command Line Interface)方面將其結果輸出。


下面我們就一起來看看這一功能在S32K144 MCU上的具體實現。3.1 FreeRTOS的任務運行時間統計( Run Time Statistics)功能FreeRTOS的任務運行時間統計功能可以收集有關每個任務已使用的處理時間的信息。然後,使用vTaskGetRunTimeStats()API函數以表格格式顯示此信息,如下圖所示。


使用FreeRTOS的任務運行時間統計功能的需要三個宏。這些可以在FreeRTOSConfig.h中定義。① configGENERATE_RUN_TIME_STATS通過將configGENERATE_RUN_TIME_STATS定義為1來啟用運行時統計信息的收集。一旦設置了該值,則還必須定義其他兩個宏才能成功編譯。② portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()Tips:運行時統計信息時基需要比滴答中斷具有更高的解析度–否則,統計信息可能太不準確而無法真正有用。建議使時基比滴答中斷快10至100倍。時基越快,統計信息將越準確-但計時器值也會越早溢出。如果將configGENERATE_RUN_TIME_STATS定義為1,則RTOS內核將在啟動時自動調用portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()(從vTaskStartScheduler() API函數中調用)。旨在使應用程式設計者使用宏來配置合適的時基。下面提供了一些示例。③ portGET_RUN_TIME_COUNTER_VALUE()此宏應僅返回由portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()配置的當前「時間」。Tips:關於FreeRTOS任務運行時間統計功能實現細節和使用方法及樣例代碼,請參考如下FreeRTOS官網連結,此處不再贅述:FreeRTOS Run Time Statistics

https://www.freertos.org/rtos-run-time-stats.html


3.2 FreeRTOS還提供了擴展命令行接口(CLI--Command Line Interface)功能FreeRTOS + CLI(命令行接口)提供了一種簡單,小型,可擴展且RAM資源佔用小的方法,使用戶的FreeRTOS應用程式能夠處理命令行輸入。按照如下流程,只需要簡單幾步即可添加用戶自定義的命令。

Tips:關於FreeRTOS + CLI(命令行接口)的實現細節和使用方法及樣例代碼,請參考如下FreeRTOS官網連結,此處不再贅述:

FreeRTOS+CLI An Extensible Command Line Interface Framework

https://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_CLI/FreeRTOS_Plus_Command_Line_Interface.html


3.3 基於FreeRTOS的S32K144應用代碼運行時間統計實現按照3.1小節和3.2小節的介紹,在S32DS for ARM v2018.R1IDE中新建S32K1xx SDK RTM3.0的S32K144應用工程,添加FreeRTOS組件,將FreeRTOS CLI移植到應用工程中,(配置CLI通信命令接口重定向到S32K144-EVB的OpenSDA虛擬串口(波特率:115200,字符長度:8-bit/char,無奇偶校驗位,1-bit停止位)),並配置使能FreeRTOS的運行時統計功能:

FreeRTOS CLI中實現taskstats tasklist和runtime命令的關鍵代碼如下:
static BaseType_t prvTaskStatsCommand( char *pcWriteBuffer,                                          size_t xWriteBufferLen,                                          const char *pcCommandString ){  int8_t *pcParameter1;    BaseType_t xParameter1StringLength;    BaseType_t xResult = pdPASS;
pcParameter1 = FreeRTOS_CLIGetParameter ( pcCommandString, 1, &xParameter1StringLength ); if(pcParameter1==NULL) { snprintf( pcWriteBuffer, xWriteBufferLen, xTaskStatsCommand.pcHelpString );
return pdFALSE; }
if( strncmp( pcParameter1, "tasklist", xParameter1StringLength ) == 0 ) { vTaskList( pcWriteBuffer ); UART_SendDataBlocking(&uart_pal1_instance,TaskList_String, strlen( TaskList_String ), 50); }
else if( strncmp( pcParameter1, "runtime", xParameter1StringLength ) == 0 ) { vTaskGetRunTimeStats(pcWriteBuffer); UART_SendDataBlocking(&uart_pal1_instance,TaskRunTime_String, strlen(TaskRunTime_String), 50); } else xResult = pdFAIL;
if( xResult == pdFAIL ) { snprintf( pcWriteBuffer, xWriteBufferLen, "parameters error\r\n\r\n" ); }

return pdFALSE;}

在FreeRTOS組件中配置使能運行時間和任務統計功能(Run time and task stats):① 勾選「Collect runtime statistics」選項,配置宏定義configGENERATE_RUN_TIME_STATS為1,使能FreeRTOS的任務運行時間統計功能:

② 配置portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()使用CM4內核的DWT模塊的周期計數器作為FreeRTOS的任務運行時間統計參考計數器:

{*(uint32_t *)0xE000EDFC  |= 1 << 24; \*(uint32_t *)0xE0001004  = 0;  \*(uint32_t *)0xE0000100  |= 1 << 0;    }

③ 配置portGET_RUN_TIME_COUNTER_VALUE() 返回CM4內核的DWT模塊周期計數器值:

(*(uint32_t *)0xE0001004) 

保存配置,重新生成代碼,編譯下載後,在串口調試助手(推薦使用Win10應用商店中下載安裝的Serial Debug Assistant)中輸入taskstats runtime命令,即可獲得當前應用工程中所有用戶任務和系統任務的運行時間統計結果(可以看到當前MCU應用程式中FreeRTOS的空閒任務運行佔用了92%的CPU時間,FreeRTOS CLI任務佔用3%的CPU時間,CAN通信(CAN_Com)任務佔用大概3%的CPU時間,其中,run_count對應的是CPU內核的時鐘周期,即1/80MHz = 12.5ns):

Tips:如果不定義portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()和portGET_RUN_TIME_COUNTER_VALUE(),僅僅勾線勾選「Collect runtime statistics」選項,則默認使用CM4內核的SysTick定時器作為運行時間統計參考,其結果將存在很大的誤差:


本文介紹了ARM Cortex-M4F內核的DWT模塊功能和使用其實現應用程式代碼執行時間測量的Bare-Metal和FreeRTOS運行時間統計功能實現,前者的測量結果更加準確,使用也非常靈活,後者測量的代碼塊為FreeRTOS的任務,不包含MCU中斷ISR的執行時間,它雖然測量精度不如Bare-Metal方法,但是可以得到比較全面的內核性能比較結果。為了幫助大家更好的學習和掌握本文介紹的內容,我將相關實現代碼和樣例工程分享到如下百度雲盤連結,供大家參考:連結: https://pan.baidu.com/s/1pu5lsuNnsikWTWC-ePx-ZQ

本公眾號近期文章精選推薦(點擊文章標題即可直接跳轉閱讀):


1. 深入淺出談嵌入式MCU 內核之ARM Cortex-M系列CPU內核功能特性概述與對比(強烈推薦!!!);

2. 深入淺出談嵌入式MCU 內核之ARM Cortex-M系列CPU內核特權模式定義與切換方法詳解;

3. 淺談嵌入式MCU軟體開發之MCU在線調試功能正常而離線工作異常原因探究(以NXP汽車MCU為例);

4. S32K1xx ECU bootloader開發之RAM NVM驅動(S19文件)生成與集成調用和測試詳解;

5. 汽車電子ECU bootloader開發之S32K1xx系列MCU NVM驅動獨立安全bootloader開發詳解;

6. S32K1xx系列MCU應用指南之FlexCAN模塊功能與應用詳解;

7. S32K SDK使用詳解之can_pal組件和flexcan組件使用詳解(含RxFIFO DMA和ID濾波器以及總線關閉恢復等);

8. 淺談嵌入式MCU軟體開發之S32K1xx系列MCU的啟動過程和啟動時間優化方法詳細;

9. 淺談嵌入式MCU軟體開發之SEGGER實時傳輸(RTT)的移植和printf()重定向應用(附S32K144移植工程);


更多精彩文章,請進入本公眾號主頁,通過分類菜單訪問或者點擊以下歷史文章分類列表目錄獲取閱讀連結:


歷史文章分類列表目錄(點擊文章標題即可直接跳轉閱讀,截止2020年11月15日)》;


原創寫作不易, 如果大家覺得本文對你的工作和學習有幫助,也歡迎大家讚賞鼓勵----我將堅持寫作,給大家帶來更多精彩的原創文章。


Tips:點擊本文文末的「喜歡作者」對本文進行讚賞或者「在看」進行分享,並留言提問,我將第一時間回復大家的關切!


歡迎在此與我一起學習/探討汽車電子和嵌入式系統軟硬體設計相關的技術。若對本公眾號或者分享的文章觀點有任何意見和建議也歡迎留言指出。您的點讚/關注/轉發分享是對我辛勤寫作的最大支持和肯定!

本公眾號已開通關鍵詞回復功能,請在公眾號主頁回復如下關鍵詞以獲取更多信息和精彩文章:


關於作者,請回復關鍵詞「作者簡介」;

聯繫作者,請回復關鍵詞「聯繫作者」;

獲取高清PDF版本公眾號文章,請回復關鍵詞「獲取文章」;

獲取專業及時的技術支持服務,請回復關鍵詞「專業服務」;

下載2017~2018年度原創技術文章集合高清PDF,請回復關鍵詞「文章全集」;

CodeWarrior IDE license購買及安裝使用問題諮詢,請回復關鍵詞「CW License」;

汽車乙太網轉工業乙太網轉換器購買,請回復關鍵詞「乙太網轉換器購買」;

獲取最新最全的公眾號原創技術分享文章目錄,請回復關鍵詞「文章目錄」;


鄭重聲明:本公眾號所有原創技術文章免費閱讀,文中所有觀點/結論均為個人觀點,不代表任何公司官方觀點意見;所有demo代碼/程序,僅作參考學習,不保證質量,若用於商業用途,責任自負;所有本公眾號文章,版權歸本人所有智慧財產權,一切未經本人同意的轉載均屬違法,盜版必究~!


如果你喜歡本公眾號的文章,請點擊文章最開始的公眾號關注或微信直接長按掃描識別下方二維碼關注,你也可以在微信添加朋友-->公眾號-->輸入"汽車電子expert成長之路"搜索-->點擊關注。若對本文觀點有任何意見和建議也歡迎留言指出。

您的關注、點讚、轉發分享是對我辛勤寫作的最大肯定!

另外,我在這裡也鄭重推薦大家掃描下方二維碼(長按掃描識別下方二維碼關注),下載專注於汽車電子技術分享和知識學習服務的「涅槃汽車APP」,同步閱讀我的汽車電子與嵌入式MCU軟硬體系統開發原創技術分享系列文章專輯(我後期的所有原創技術分享文章都將同步更新到此APP在這裡能夠找到眾多汽車電子從業同行和業界專家大咖,大家一起交流學習!)

Enwei Hu(胡恩偉)

2021年01月11日於山城·重慶


相關焦點

  • 淺談嵌入式MCU軟體開發之SEGGER實時傳輸(RTT)的移植和printf()重定向應用(附S32K144移植工程)
    在阻塞模式下,應用程式將在緩衝區已滿時等待,直到可以寫入所有內存為止,從而導致應用程式處於阻塞狀態,但可以防止數據丟失。在非阻塞模式下,只會寫入適合緩衝區的數據,或完全不寫入緩衝區的數據,其餘的將被丟棄。即使沒有連接調試器,也可以實時運行。開發人員不必創建特殊的調試版本,並且代碼可以保留在發布應用程式中。
  • 兆易創新發布GD32E232系列MCU新品,引領Arm Cortex-M23內核向縱深...
    GD32E232系列採用4 x 4 mm和3 x 3 mm的小型封裝供貨,特別適用於需要精密MCU和空間受限的應用,如光學模塊、光電轉換、光纖網絡、基站系統、精密儀器、工業控制和自動化系統等。目前,該系列產品已經開始提供樣片並將於二月份正式投入量產。本文引用地址:http://www.eepw.com.cn/article/202001/409036.htm
  • 使用市面上首款基於 Arm® Cortex®-M33 的 MCU –第 1 部分...
    NXP Semiconductors 的 LPC55S6x 微控制器系列器件架構,既有通用處理器的靈活性,又有新興應用所需的專門處理能力和安全性,從而免除設計人員的妥協之困。圖 1:LPC55S6x 微控制器架構在 Arm Cortex-M33 內核的通用處理能力基礎上,擴展了專門硬體模塊用於執行信號處理、加密、安全存儲和密鑰管理,同時還提供典型嵌入式設計所需的全套外設。
  • Linux 系統內核的調試
    本文將首先介紹 Linux 內核上的一些內核代碼監視和錯誤跟蹤技術,這些調試和跟蹤方法因所要求的使用環境和使用方法而各有不同,然後重點介紹三種 Linux 內核的原始碼級的調試方法。  調試是軟體開發過程中一個必不可少的環節,在 Linux 內核開發的過程中也不可避免地會面對如何調試內核的問題。
  • 兆易創新推出GD32V系列RISC-V內核32位通用MCU新品
    作為GD32 MCU家族基於RISC-V內核的首個產品系列,全新的GD32VF103系列RISC-V MCU面向主流型開發需求,以均衡的處理效能和系統資源為RISC-V進入市場主流應用提供了高性價比的創新之選。新品首批提供了14個型號,包括QFN36、LQFP48、LQFP64和LQFP100等4種封裝類型選擇,並完整保持了與現有產品在軟體開發和引腳封裝方面的兼容性。
  • 《疑難答疑》之S12G系列MCU使用Hiwave和BDM調試器debug時無法使用邏輯地址查看和保存P-flash問題的解決
    map文件)淺談嵌入式MCU軟體開發之startup過程詳解(從復位向量到main函數之前的準備工作)淺談嵌入式MCU軟體開發之S32K1xx系列MCU啟動過程及重映射代碼到RAM中運行方法詳解《汽車電子ECU BootLoader開發》系列相關文章連結與資源匯總       淺談嵌入式MCU開發中的三個常見誤區
  • 不同位數的MCU的用途及國內外主流晶片商
    該公司有自己架構的單片機,叫PIC,分別有PIC8 PIC16 PIC32 等系列 ,pic單片機也有採用mips的microAptiv內核 ;還有一個系列的產品是傳統8051/80c51產的mcu。公司mips合作,用mips的內核做mcu而跟ARM對抗,所以他們沒有基於ARM架構的MCU。
  • 嵌入式底層開發的軟體框架簡述
    簡單的順序執行程序:這類寫法是大多數人使用的方法,不需用思考程序的具體架構,直接按照執行順序編寫應用程式即可。2.前後臺執行程序:在順序執行的情況上增添中斷前臺處理機制,配置順序執行的後臺大循環程序,組合成可以實時響應的程序。3.
  • ST最新發布Cortex-A9內核嵌入式處理器
    打開APP ST最新發布Cortex-A9內核嵌入式處理器 OFweek 發表於 2019-09-06 11:42:33 (文章來源
  • ARM-Linux開發與MCU開發的差別是什麼
    、驅動程序開發、系統內核開發,針對不同種類的軟體開發,有其不同的特點。還有一種是在ARM晶片上運行作業系統,對於硬體的操作需要編寫相應的驅動程序,應用開發則是基於作業系統的,這種方式的嵌入式應用開發與單片機開發差異較大。
  • 一個產品級MCU內存管理方案
    或:一個變量,在一段時間內使用,不是整個程序運行生命周期都要用,但是用這個變量的函數會退出,然後重複進入(用static定義的局部變量相當於全局變量如果內存分配只有25%的使用率,對於小內存嵌入式設備來說,是致命的方案缺陷。
  • 一文講解單片機、ARM、MCU、DSP、FPGA、嵌入式錯綜複雜的關係!
    其基於專為要求高性能、低成本、低功耗的嵌入式應用專門設計的ARM Cortex-M內核,同時具有一流的外設:1μs的雙12位ADC,4兆位/秒的UART,18兆位/秒的SPI等等,在功耗和集成度方面也有不俗的表現,當然和MSP430的功耗比起來是稍微遜色的一些,但這並不影響工程師們對它的熱捧程度,由於其簡單的結構和易用的工具再配合其強大的功能在行業中赫赫有名…其強大的功能主要表現在:
  • 嵌入式Linux啟動時間優化的秘密之一工具鏈/應用程式優化
    2.啟動時間測量方法   要降低系統的啟動時間,則首先需要選擇一個可靠的啟動時間的測量方法:   在Linux代碼中加入對某一個GPIO腳的邏輯電平控制,利用示波器測量GPIO狀態。後面將介紹如何在代碼中加入對GPIO的控制。   監控串口控制臺報文以測量時間,可以使用grabserial。
  • MCU原廠及其產品和代理分銷商介紹
    英飛凌8位單片機主要有XC800系列、XC886系列、XC888系列、XC82x、XC83x系列等。 MCU產品線 總部:珠海 官網:www.myorbita.net 珠海歐比特控制工程股份有限公司是國內具有自主智慧財產權的高可靠高性能嵌入式SoC晶片、立體封裝SiP模塊、智能圖像處理及人臉識別、微型太空飛行器、
  • Linux內核概述
    那我們先簡單說說作業系統,作業系統是面向用戶的,計算機用戶可以使用計算機作業系統來工作,聊天,玩遊戲,我們使用的這些東西都是應用軟體,對應用程式來說,內核就是它的作業系統,這個系統可以為應用程式工作,管理應用程式。
  • 基於Windows CE的數控軟體開發與實現
    摘要:本文介紹了嵌入式Windows CE 系統在數控加工應用領域的平臺定製,提出了在Windows CE 下的嵌入式數控加工系統的軟體架構,探討了嵌入式數控軟體主要功能模塊及其關鍵實現技術。1 Windows CE系統內核的定製嵌入式系統上應用軟體的開發離不開底層系統的支持,Windows CE 系統下應用程式架構如圖1 所示。
  • FPGA 解決方案和標準控制器內核比較
    MicroBlaze處理器是賽靈思(Xilinx)在嵌入式開發套件 (EDK) 中提供的兩款32位內核之一,是實現硬體加速的靈活工具。圖1是MicroBlaze的典型設計。該內核含有一個32位乘法器,但不含浮點單元(FPU)、桶式移位器或專用硬體加速器。
  • 瑞薩 – 基於Arm Cortex-M的新系列MCU提供了高安全性和軟體靈活性
    瑞薩RA系列是基於Arm Cortex-M內核架構的全新32位MCU系列,該系列採用了瑞薩針對嵌入式系統外設的一流技術。RA系列包括RA2、RA4和RA6系列,為用戶提供了廣泛的性能等級和功能選擇。Synergy平臺包括多個基於Arm Cortex-M內核的元器件,對於需要完整軟體平臺的客戶而言,Synergy是一個出色的解決方案,可幫助客戶快速地將產品推向市場。而對於希望自由選擇軟體環境並能夠重用其現有軟體資產的客戶而言,RA系列是更合適的選擇。
  • 8位或32位,MCU該怎麼選?
    在許多應用中,8位元內核能依然能夠彌補M0+或M3內核不利的地方,甚至在一些方面性能更佳。開發工具也很重要。現代嵌入式韌體開發需要全功能IDE、現成的韌體庫、豐富的範例、完整的評估和入門套件以及助手應用以簡化硬體設定、庫管理和量產程式設計之類的工作。當MCU有了現代化的8位元內核和開發環境後,在很多情況下,這樣的MCU將超越基於ARM Cortex的類似MCU。
  • 平頭哥宣布開源MCU設計平臺 軟硬體全套開原始碼已在GitHub公布
    平臺開原始碼包括基礎硬體代碼和配套軟體代碼兩部分,現已公布在GitHub開源社區。平臺面向AIoT時代的定製化晶片設計需求,目標群體包括晶片設計公司、IP供應商、高校及科研院所等。全世界的開發者都能基於該平臺設計面向細分領域的定製化晶片,IP供應商可以研發原生於該平臺的核心IP,高校和科研院所則可開展晶片相關的教學及科研活動。