0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

分享使用 MATLAB 生成 C 代碼的方法和研究

MATLAB ? 來源:djl ? 2019-09-16 15:41 ? 次閱讀

一直以來,工程師都手工編寫 C 語言實(shí)現(xiàn)算法再通過編譯器編譯為機(jī)器代碼。能否使用編碼器MATLAB 這樣的高級(jí)語言翻譯成 C 語言?大多數(shù)工程師認(rèn)為這是可行的——理論來說。

但實(shí)際上是否可行?

生成的代碼是可讀性如何?效率如何?執(zhí)行速度如何?

面向工業(yè)流程或只是處于研發(fā)階段?

MATLAB Coder 的使用技巧和最佳實(shí)踐可以直接回答以上問題,這里還將分享行業(yè)將 MATLAB 生成 C 代碼的成功經(jīng)驗(yàn)和應(yīng)用案例(包括 Delphi、Baker Hughes、iSonea、dorsaVi 等)。

- 對(duì)比 MATLAB 和 C 代碼 -

以下面這個(gè)簡(jiǎn)單的 MATLAB 乘法函數(shù)為例。

function c = myMult (a, b)

% Multiply two inputs

c = a * b;

給定標(biāo)量輸入,MATLAB Coder 可以生成下面的 C 代碼:

#include "myMult.h"

doublemyMult (doublea,doubleb)

{

return a *b;

}

正如所見,生成的代碼清楚地與 MATLAB 代碼相映射。

同樣的 MATLAB 代碼,當(dāng)給定兩個(gè)矩陣輸入時(shí),在生成的 C 代碼中會(huì)包含三層嵌套的 for 循環(huán):

#include "myMult.h"

void myMult (const doublea[12],const doubleb[20],doublec[15],)

{

inti0;

inti1;

inti2;

for(i0 = 0; i0 < 3; i0++)? {

for(i1 = 0; i1 < 5; i1++)? {

c[i0 + 3 * i1] = 0.0;

for(i2 = 0; i2 < 4; i2++)? {

c[i0 + 3 * i1] += a[i0 + 3 * i2] * b[i2 + (i1 << 2 )];

}

}

}

}

推薦

- 三步迭代工作流程 -

上述簡(jiǎn)單的函數(shù)可以在一個(gè)步驟中實(shí)現(xiàn)。但是對(duì)于更多的實(shí)際項(xiàng)目來說,我們推薦使用三步迭代工作流程的結(jié)構(gòu)化方法:

分享使用 MATLAB 生成 C 代碼的方法和研究

準(zhǔn)備好需要生成代碼的算法。檢驗(yàn)并修改 MATLAB 代碼來引入生成 C 代碼的要素,使用支持代碼生成的 MATLAB 語言和函數(shù)。

使用默認(rèn)設(shè)置測(cè)試 MATLAB 代碼生成時(shí)的可讀性。通過生成并執(zhí)行 MEX 文件來檢查運(yùn)行中的錯(cuò)誤。如果運(yùn)行成功,則進(jìn)行下一步。如果不成功,則重復(fù)第一步直到能生成一個(gè) MEX 函數(shù)。

生成 C 代碼或保留第二步的 MEX 函數(shù)。你可以通過迭代 MATLAB 代碼來優(yōu)化生成的 C 代碼(外觀、內(nèi)存和速度)或 MEX 函數(shù)(性能)。

MATLAB Coder app 會(huì)引導(dǎo)你在MATLAB環(huán)境中完成這一迭代過程:

分析你的 MATLAB 代碼,提供輸入數(shù)據(jù)的類型和大小

生成一個(gè) MEX 函數(shù),測(cè)試你的 MATLAB 代碼是否準(zhǔn)備好

執(zhí)行 MEX 函數(shù),檢查運(yùn)行錯(cuò)誤

等效的命令行函數(shù)提供同樣的功能,因此你可以生成代碼作為腳本或函數(shù)的一部分。

分享使用 MATLAB 生成 C 代碼的方法和研究

左:自動(dòng)檢測(cè)不支持代碼生成的特征和函數(shù)。

右:自動(dòng)分析和建議輸入數(shù)據(jù)的類型和大小。

- 實(shí)際生成代碼的限制 -

當(dāng)你準(zhǔn)備好代碼生成的 MATLAB 算法時(shí),你需要考慮到 MATLAB 和 C 代碼的差別導(dǎo)致的限制,包括:

內(nèi)存分配。在 MATLAB 中,內(nèi)存分配是自動(dòng)的。在 C 代碼中,內(nèi)存分配則是手動(dòng)的——可以是靜態(tài)(static),動(dòng)態(tài)(malloc),或者堆棧(局部變量)。

數(shù)組語言。MATLAB 提供豐富的數(shù)組運(yùn)算集,可以簡(jiǎn)化數(shù)值算法的代碼。C 代碼則需要用明確的 for 循環(huán)表達(dá)同樣的算法。

動(dòng)態(tài)類型。MATLAB 可以在運(yùn)行時(shí)自動(dòng)地確定數(shù)據(jù)類型和大小。C 語言要求對(duì)所有變量和函數(shù)進(jìn)行明確的類型聲明。

多態(tài)性。MATLAB 函數(shù)可以支持多種不同輸入類型,而 C 語言要求固定的類型聲明。在頂層,你必須明確預(yù)期的 C 函數(shù)聲明。

這里詳細(xì)說明多態(tài)性。多態(tài)性可以根據(jù)你的輸入給一行 MATLAB 代碼賦予不同的意義。例如,圖中的函數(shù)可以表示標(biāo)量乘法,向量點(diǎn)積,或者矩陣乘法。另外,你的輸入可以是不同的數(shù)據(jù)類型(邏輯值,整形,浮點(diǎn)數(shù),定點(diǎn)數(shù)),也可以是實(shí)數(shù)或復(fù)數(shù)。

分享使用 MATLAB 生成 C 代碼的方法和研究

MATLAB 強(qiáng)大的算法開發(fā)環(huán)境體現(xiàn)于當(dāng)你創(chuàng)建算法時(shí),不需要考慮實(shí)現(xiàn)的具體細(xì)節(jié)。但是,對(duì)于等效的 C 代碼,你不得不明確操作的含義。例如上述案例,MATLAB 代碼可以被翻譯成一行返回 B*C 的值的 C 代碼:

doublefoo (doubleb,doublec)

{

return b * c;

}

或者,它可以被翻譯成 11 行由 3 層 for 循環(huán)組成的將兩個(gè)矩陣相乘的 C 代碼:

void myMult (const doublea[12],const doubleb[20],doublec[15],)

{

inti0;

inti1;

inti2;

for(i0 = 0; i0 < 3; i0++)? {

for(i1 = 0; i1 < 5; i1++)? {

c[i0 + 3 * i1] = 0.0;

for(i2 = 0; i2 < 4; i2++)? {

c[i0 + 3 * i1] += a[i0 + 3 * i2] * b[i2 + (i1 << 2 )];

}

}

}

}

- 多核代碼生成和其他優(yōu)化方法 -

在 MATLAB 中,迭代過程互相獨(dú)立的 for 循環(huán)可以簡(jiǎn)單地通過將 for 替換為 parfor 實(shí)現(xiàn)并行運(yùn)行。MATLAB Coder 使用 Open Multiprocessing (OpenMP)應(yīng)用程序接口來支持 parfor 循環(huán)中的共享內(nèi)存和多核代碼生成。OpenMP 被很多 C 編譯器(例如 Microsoft Visual Studio Professional)支持 。

你可以使用有 Embedded Coder 的 MATLAB Coder 來進(jìn)一步優(yōu)化代碼效率并定制生成的代碼。Embedded Coder 提供對(duì)生成的代碼的函數(shù)、文件和數(shù)據(jù)的細(xì)粒度控制的優(yōu)化。

例如你可以使用存儲(chǔ)類來控制生成的代碼中全局變量的聲明和定義,并使用代碼生成模板來自定義生成的代碼中的橫幅和注釋。Embedded Coder 還可以通過使用代碼替換庫來提高代碼效率,代碼替換庫可以使用為 ARM Cortex-A 和 ARM Cortex-M 等流行的處理器而優(yōu)化過的實(shí)現(xiàn)來替換某些運(yùn)算符和函數(shù)。

- 測(cè)試生成的代碼 -

在開發(fā) MATLAB 算法時(shí),你可以創(chuàng)建單元測(cè)試來驗(yàn)證算法是否能產(chǎn)生你預(yù)期的結(jié)果。使用 MATLAB 單元測(cè)試框架編寫的測(cè)試可以被用于驗(yàn)證生成的代碼的運(yùn)行情況是否與 MATLAB 算法一致。使用 Embedded Coder 你可以結(jié)合 SIL 和 PIL 在測(cè)試生成的獨(dú)立代碼或庫時(shí)實(shí)現(xiàn)單元測(cè)試的重用。

- 自動(dòng)化工作流程 -

MATLAB Coder 保證了將 MATLAB 算法轉(zhuǎn)換為 C 代碼的自動(dòng)化工作流程。這個(gè)工作流程可以花費(fèi)更少的時(shí)間編寫和調(diào)試低C代碼,而有更多的時(shí)間用于開發(fā)、測(cè)試和調(diào)優(yōu)設(shè)計(jì)。

通過 MATLAB 中的黃金參考,包括算法和測(cè)試平臺(tái),你可以更快地將算法移植到 C 代碼中。MATLAB 單元測(cè)試以及 Embedded Coder 的 SIL 和 PIL 測(cè)試框架等自動(dòng)化工具,可以讓你全面而系統(tǒng)地測(cè)試MATLAB 代碼和 C 代碼。無論你是在傳統(tǒng) 的PC端,Web 服務(wù)器,移動(dòng)設(shè)備,還是嵌入式處理器上實(shí)現(xiàn)設(shè)計(jì),MATLAB Coder 將幫助您更快地從 MATLAB 生成 C 代碼,并減少手工錯(cuò)誤。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6715

    瀏覽量

    88308
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4237

    瀏覽量

    61967
  • C代碼
    +關(guān)注

    關(guān)注

    1

    文章

    89

    瀏覽量

    14237
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    探討AI編寫代碼技術(shù),以及提高代碼質(zhì)量的關(guān)鍵:靜態(tài)代碼分析工具Perforce Helix QAC &amp; Klocwork

    令軟件開發(fā)人員夜不能寐的事情比比皆是。如今,他們最關(guān)心的問題不再是如何用自己喜歡的語言(C、C++、Erlang、Java 等)表達(dá)最新的算法,而是人工智能(AI)。 本文中,我們將介紹AI編寫代碼
    的頭像 發(fā)表于 06-05 14:10 ?271次閱讀

    ISEDA首發(fā)!大語言模型生成代碼到底好不好使

    的問題 — 這些自動(dòng)生成代碼真的有效嗎?大模型也會(huì)犯錯(cuò),我們肯定不希望把看似正確的錯(cuò)誤結(jié)果交給用戶,所以需要一個(gè)能精確驗(yàn)證模型生成答案的考官。 近期,芯華章提出了一種對(duì)大模型生成
    發(fā)表于 05-16 13:41 ?242次閱讀
    ISEDA首發(fā)!大語言模型<b class='flag-5'>生成</b>的<b class='flag-5'>代碼</b>到底好不好使

    生成SPWM波形的方法

    生成SPWM波形的方法? SPWM波形產(chǎn)生是一種常見的數(shù)字信號(hào)生成技術(shù),用于控制交流電子設(shè)備的輸出電壓或電流的形狀,使其接近正弦波。 SPWM波形是由一系列的脈沖信號(hào)組成,每個(gè)脈沖信號(hào)的寬度由一個(gè)
    的頭像 發(fā)表于 02-06 13:52 ?2057次閱讀

    RL78的代碼生成器發(fā)布說明

    電子發(fā)燒友網(wǎng)站提供《RL78的代碼生成器發(fā)布說明.pdf》資料免費(fèi)下載
    發(fā)表于 01-30 09:48 ?0次下載
    RL78的<b class='flag-5'>代碼</b><b class='flag-5'>生成</b>器發(fā)布說明

    DC2100B/A能不能支持MATLAB/simulink自動(dòng)代碼生成

    1、硬件方面,微控制器是主要有幾種,計(jì)算能力如何,可以支持類似MPC的算法嗎?能不能擴(kuò)展DSP的控制器? 2、軟件方面,能不能支持MATLAB/simulink自動(dòng)代碼生成
    發(fā)表于 01-11 06:56

    單片機(jī)代碼自動(dòng)生成器程序

    單片機(jī)代碼自動(dòng)生成器是一種能夠幫助開發(fā)人員快速生成單片機(jī)代碼的工具。它利用了現(xiàn)代計(jì)算機(jī)技術(shù)和算法,能夠根據(jù)用戶提供的輸入和需求,自動(dòng)生成符合
    的頭像 發(fā)表于 01-08 14:12 ?2255次閱讀

    計(jì)算機(jī)快速全息生成技術(shù)研究

    快速全息生成技術(shù)依賴于計(jì)算機(jī)生成的全息影像 (CGH) 的快速創(chuàng)建。目前,基于光線追蹤的計(jì)算機(jī)生成全息圖的快速生成方法仍基于非物理光線追蹤方法
    的頭像 發(fā)表于 12-12 11:15 ?420次閱讀
    計(jì)算機(jī)快速全息<b class='flag-5'>生成</b>技術(shù)<b class='flag-5'>研究</b>

    代碼生成:基于 AI 大模型的挑戰(zhàn)與前景

    使用AI通用模型來完成代碼生成這類非常具體的任務(wù)可能會(huì)帶來問題。人工智能生成代碼就像是陌生人的代碼,它們可能并不符合你的
    的頭像 發(fā)表于 11-26 08:05 ?645次閱讀
    <b class='flag-5'>代碼</b><b class='flag-5'>生成</b>:基于 AI 大模型的挑戰(zhàn)與前景

    從HumanEval到CoderEval: 你的代碼生成模型真的work嗎?

    本文主要介紹了一個(gè)名為CoderEval的代碼生成大模型評(píng)估基準(zhǔn),并對(duì)三個(gè)代碼生成模型(CodeGen、PanGu-Coder和ChatGPT)在該基準(zhǔn)上的表現(xiàn)進(jìn)行了評(píng)估和比較。
    的頭像 發(fā)表于 11-25 15:55 ?1235次閱讀
    從HumanEval到CoderEval: 你的<b class='flag-5'>代碼</b><b class='flag-5'>生成</b>模型真的work嗎?

    simulink自動(dòng)生成ROS代碼

    當(dāng)我們用simulink完成控制程序的搭建后,我們期望下一次可以直接對(duì)ROS進(jìn)行控制,而不是每次都需要啟動(dòng)matlab和simulink,因此我們可以使用simulink的代碼生成器,生成
    的頭像 發(fā)表于 11-15 17:53 ?656次閱讀
    simulink自動(dòng)<b class='flag-5'>生成</b>ROS<b class='flag-5'>代碼</b>

    基于 TouchGFX 生成代碼中添加觸摸功能的方法

    基于 TouchGFX 生成代碼中添加觸摸功能的方法
    的頭像 發(fā)表于 10-27 09:21 ?710次閱讀
    基于 TouchGFX <b class='flag-5'>生成</b>的<b class='flag-5'>代碼</b>中添加觸摸功能的<b class='flag-5'>方法</b>

    使用VectorCAST MATLAB Toolbox獲取代碼覆蓋度的基本步驟

    不同階段的常用方法,用于有效驗(yàn)證生成的嵌入式代碼。SIL測(cè)試目的是驗(yàn)證嵌入式代碼的正確性,甄別潛在的問題,并評(píng)估程序的初步性能,一般在PC上即可執(zhí)行;PIL則須運(yùn)行在物理目標(biāo)板上,主要
    的頭像 發(fā)表于 10-26 11:06 ?885次閱讀
    使用VectorCAST <b class='flag-5'>MATLAB</b> Toolbox獲取<b class='flag-5'>代碼</b>覆蓋度的基本步驟

    利用Simulink自動(dòng)生成STM32串口代碼

    功能:利用Simulink自動(dòng)生成STM32串口代碼,在Keil中編譯后直接下載到主芯片,實(shí)現(xiàn)串口通訊的功能。
    的頭像 發(fā)表于 10-25 17:04 ?1540次閱讀
    利用Simulink自動(dòng)<b class='flag-5'>生成</b>STM32串口<b class='flag-5'>代碼</b>

    單片機(jī)C代碼嵌套匯編的一些方法

    單片機(jī)C代碼嵌套匯編的一些方法
    的頭像 發(fā)表于 10-18 16:39 ?423次閱讀
    單片機(jī)<b class='flag-5'>C</b><b class='flag-5'>代碼</b>嵌套匯編的一些<b class='flag-5'>方法</b>

    基于代碼生成的車身網(wǎng)絡(luò)電控系統(tǒng)設(shè)計(jì)

    電子發(fā)燒友網(wǎng)站提供《基于代碼生成的車身網(wǎng)絡(luò)電控系統(tǒng)設(shè)計(jì).pdf》資料免費(fèi)下載
    發(fā)表于 10-08 14:28 ?0次下載
    基于<b class='flag-5'>代碼</b><b class='flag-5'>生成</b>的車身網(wǎng)絡(luò)電控系統(tǒng)設(shè)計(jì)