国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

通過一些附加信息和有用的實現技術對C函數的探索

multisim ? 來源:multisim ? 作者:multisim ? 2020-09-27 11:11 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在本文中,我們將通過一些附加信息和一些有用的實現技術來結束對C函數的探索。

基本的C函數(例如,一個或兩個參數和一個返回值)并不復雜。但是,C函數非常靈活,通過超越基礎知識,您可以更輕松地編寫代碼,并將一些有益的特性引入固件。

1.將函數原型放入頭文件中

有時我想知道一個人是否必須是計算機科學專業才能完全理解C語言功能原型。這確實是一個相當復雜的問題。我認為固件工程師可以放心地忽略這些細節,而只需采取以下標準操作:始終為您的功能提供一個原型,并將這些原型放置在頭文件中。

函數原型是一行代碼,為編譯器提供函數自變量和返回值的數據類型。例如:

float ArithmeticMean(char Value1,char Value2,char Value3);

復制代碼

實際上,不必包含輸入參數的名稱,因為此時編譯器希望知道的只是數據類型。因此,您也可以按如下方式編寫原型:

float ArithmeticMean(char,char,char);

復制代碼

我更喜歡包含參數名稱,這可能是因為它允許我通過從函數定義中復制和粘貼來創建函數原型。
當函數原型被遺漏或放錯位置時,可能會發生奇怪的事情,而根據我的經驗,消除這些問題的最簡單方法是將所有函數原型放置在項目的所有源文件中包含的頭文件中。這樣可以確保您可以安全地在任何源文件中使用任何函數,因為在調用每個函數之前,總是會對其進行聲明(即,在頭文件中)。

例如,以下代碼段摘自一個名為“ Project_DefsVarsFuncs.h”的文件。

//function prototypes

void Delay_us(unsigned int DelayCount);

void Delay_10ms(unsigned int DelayCount);

void Delay_seconds(unsigned int DelayCount);

void Update_LCD(unsigned char SensorNumber, unsigned longdisplayValue);

void LCD_Clear_All();

復制代碼

此頭文件包含在我的源文件中,如下所示:

//-----------------------------------------------------------------------------

// Includes

//-----------------------------------------------------------------------------

#include "Project_DefsVarsFuncs.h"

復制代碼

2.將函數聲明為靜態以避免命名沖突
隨著固件項目變得越來越大和越來越復雜,您可能會發現要在不同的源文件中重用相同的功能名稱。您可以使用“ static”關鍵字來完成此操作。如上所述,在這種情況下,您不會將函數原型放置在頭文件中。
“ static”關鍵字將功能范圍限制為一個源文件。這使您可以對不同源文件中的不同功能使用相同的功能名稱。在下面顯示的示例中,該項目需要三個不同的ProcessData()函數-一個用于分析ADC數據,一個用于響應UART命令,另一個用于處理I 2 C消息。

我將“ static”關鍵字放在函數原型的前面,然后函數原型移到源文件的頂部(即,在由函數體內的處理器指令組成的“正?!贝a之前)。
當多個工程師將要從事同一固件項目時,“ static”關鍵字也很方便。如果兩個工程師正在不同的源文件中工作,則使用靜態功能可以使工程師A選擇功能名稱,而不必擔心工程師B將為不同功能選擇相同名稱的可能性。

3.使用指針將數組傳遞給函數
嵌入式應用程序經常使用數組-傳感器讀數,ADC值,短ASCII消息等序列。在這種開發環境中,函數似乎有點尷尬,因為您無法將數組傳遞給C函數。確實,您不能像傳遞單個變量那樣傳遞數組,但是可以使用指針為函數提供對數組數據的訪問權限。
如果將指針作為參數之一,然后在調用函數時傳遞數組標識符,則函數主體中的語句可以使用該指針讀取和修改數組的內容。如果您對此概念感到有些困惑,建議您先閱讀有關C語言中數組的文章 ,然后閱讀有關指針的第一篇文章。

4.您可以使用指針調用函數
指針是保存內存地址的變量。該地址通常標識變量或數組第零個元素的位置。但是,指針也可以指向函數。

如果您已經閱讀了有關C函數的第一篇文章,您就會知道函數存儲在代碼存儲器的特定位置,就像變量存儲在數據存儲器的特定位置一樣。如果存儲在指針中的值是函數的起始地址,則可以使用指針來調用該函數。如果更改指針的值使其等于不同函數的起始地址,則可以使用同一指針來調用該不同函數。
以下代碼段顯示了如何聲明可與具有三個char參數和返回類型float的函數一起使用的函數指針。

float(* Ptr_to_Function)(char,char,char);

復制代碼

數組標識符本質上是指向數組第零個元素的指針。同樣,功能名稱被解釋為功能的起始地址(在代碼存儲器中)。因此,可以將函數分配給函數指針,如下所示:

Ptr_to_Function = ArithmeticMean;

復制代碼

現在,您可以使用Ptr_to_Function調用函數ArithmeticMean()。以下兩個語句是等效的:

Average = ArithmeticMean(Temperature1, Temperature2, Temperature3);

Average = (*Ptr_to_Function)(Temperature1, Temperature2, Temperature3);

復制代碼

5.盡可能使用局部變量
我認為,在許多情況下,我們的本能是在源文件的頂部定義所有變量,然后將其保留在該位置。但是,養成在函數中使用局部變量的習慣是很好的。局部變量的范圍僅限于定義它的功能。換句話說,變量是在調用函數時創建的,并在函數完成其任務后消失。
我推薦局部變量有兩個原因。首先,它們允許您在不同的函數中重用相同的變量名。復雜的項目可能包含許多需要基本變量的功能,例如循環計數器。我喜歡對循環計數器重復使用“ n”,而不是逐步遍歷字母表中的所有字母。
其次,使用局部變量可能會導致更快的代碼。我不是編譯器專家,但是我認為局部變量很可能放在寄存器中而不是存儲位置,并且訪問寄存器要比訪問內存快。

寄存器是處理器的組成部分,可以快速讀取和寫入數據。

結論

責任編輯:xj

原文標題:在C語言固件中使用功能的五個技巧

文章出處:【微信公眾號:multisim】歡迎添加關注!文章轉載請注明出處。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    183

    文章

    7644

    瀏覽量

    145565
  • 固件
    +關注

    關注

    11

    文章

    569

    瀏覽量

    24967

原文標題:在C語言固件中使用功能的五個技巧

文章出處:【微信號:A1411464185,微信公眾號:multisim】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    探索MAX20463:實現USB Type - A到Type - C的完美轉換

    Type-C,接口的變化帶來了更好的使用體驗和更高的數據傳輸效率。然而,對于一些已經采用USB Type-A接口的設備來說,如何實現向Type-C接口的轉換成為了
    的頭像 發表于 02-08 11:50 ?409次閱讀

    C語言中一些令人震驚的結構介紹

    C語言同意一些令人震驚的結構,下面的結構是合法的嗎,如果是它做些什么? int a = 5, b = 7, c; c = a+++b; 考察點: 這個問題將作為這個測驗的
    發表于 12-23 08:15

    復雜的軟件算法硬件IP核的實現

    實現技術細節,知道這些技術細節將有利于在使用 C 語言編寫算法時實現一些有針對性的優化。
    發表于 10-30 07:02

    蜂鳥E203的浮點指令集F的一些實現細節

    蜂鳥E203的浮點指令集F的一些實現細節 既然E203不是多發射,且為了節省面積,一些指令使用FPU內的同個子模塊來執行,即FPU同時只能進行
    發表于 10-24 08:57

    ?WINCS02附加技術解析與開發指南

    Microchip Technology WINCS02附加板是款高效、低成本的開發平臺,用于評估和演示Microchip低功耗Wi-Fi^?^ WINCS02PC模塊的特性和功能。該附加板符合
    的頭像 發表于 09-30 09:45 ?674次閱讀
    ?WINCS02<b class='flag-5'>附加</b>板<b class='flag-5'>技術</b>解析與開發指南

    ?RNWF02附加技術解析與開發指南

    ,而且包含個板載MCP2200 USB轉UART轉換器,可實現開箱即用評估??刂平涌谒璧男盘栠B接到附加板的板載連接器,以實現靈活性和快速原型設計。該
    的頭像 發表于 09-30 09:33 ?664次閱讀
    ?RNWF02<b class='flag-5'>附加</b>板<b class='flag-5'>技術</b>解析與開發指南

    請問gcc編譯是怎么實現個未被調用的函數最終不被鏈接到固件中的?

    如題,平時在一些項目中,看到我寫的一些未發生調用的函數,在固件里面找不到,初步斷定是gcc編譯處理了,但不知道它是怎么實現的,想了解下其原理是什么。 有了解這塊的大佬,歡迎指點指點。謝
    發表于 09-28 11:40

    【原創】TDMS設置下個寫入位置函數的摸索

    初始位置,循環覆蓋寫入,但是長時間都沒成功實現。隨后勉強實現此功能,但還是理解不了,把一些關鍵信息記錄下來,以備用,有人熟悉函數的應用,感謝
    發表于 08-11 20:54

    【「DeepSeek 核心技術揭秘」閱讀體驗】第三章:探索 DeepSeek - V3 技術架構的奧秘

    存在資源利用率不高的問題,但它是基礎探索,讓 我看到將模型分段處理以實現流水線作業的初步嘗試。 而 GPipe 方法的改進,通過微批次處理減少并行氣泡,如同給流水線 “疏通血管”,讓計算設備的閑置
    發表于 07-20 15:07

    Debian和Ubuntu哪個好一些?

    兼容性對比Debian和Ubuntu哪個好一些,并為您揭示如何通過RAKsmart服務器釋放Linux系統的最大潛能。
    的頭像 發表于 05-07 10:58 ?1134次閱讀

    如何添加一些網絡上的庫到mpy固件的說明或手冊教程?

    下有沒有關于如何添加一些網絡上的庫到mpy固件的說明或手冊教程? 問題2: 關于mpy的image庫在哪里能了解學習內部代碼,只了解一些python,想知道怎么從c轉換成mpy能調用的,自己寫的
    發表于 04-29 08:16

    S32K312通過UART口打印系統信息,是否有使用Printf () 函數打印信息的Demo例程?

    S32K312通過UART口打印系統信息,是否有使用Printf () 函數打印信息的Demo例程?
    發表于 04-11 07:21

    使用RTD5.0.0的s32k312,C40_Ip擦除pflash存在一些問題求解決

    我正在使用 RTD5.0.0 的 s32k312,C40_Ip擦除 pflash 存在一些問題: Erase block0(0x420000-0x500000) failed
    發表于 04-11 06:53

    收藏的一些庫存,直流無刷技術+源碼+論文(建議打包)

    這也是我網絡上淘過來收藏的一些資料,免費跟大家起分享下,建議下載哦,收藏不易
    發表于 03-17 20:17

    關于stm32,u8g2菜單之間切換(三)寫u8g2的一些必要函數

    byte_cb這個參數直接使用自帶的 u8x8_byte_sw_i2c即可,我們只要實現 u8x8_msg_cb gpio_and_delay_cb這個參數寫函數: ? uint
    的頭像 發表于 03-07 12:53 ?1239次閱讀
    關于stm32,u8g2菜單之間切換(三)寫u8g2的<b class='flag-5'>一些</b>必要<b class='flag-5'>函數</b>