日韩在线不卡免费视频一区,日韩欧美精品一区二区三区经典,日产精品码2码三码四码区,人妻无码一区二区三区免费,日本feerbbwdh少妇丰满

玩轉(zhuǎn)單片機(jī)與嵌入式
認(rèn)證:VIP會(huì)員
作者動(dòng)態(tài)
【硬件】深入淺出講解MOS管的柵極電阻
2022-07-28 09:00
【軟件】實(shí)現(xiàn)STM32軟件精確延時(shí)的方法(附源碼)
2022-07-28 08:51
嵌入式操作系統(tǒng)三問:what?when?how?
2022-06-11 14:55
做降本或國(guó)產(chǎn)替代時(shí),替換原來的晶振,都需要測(cè)試哪些內(nèi)容?
2022-06-11 14:51
深入淺出,明明白白的搞清楚RS-485總線!
2022-06-11 14:48

嵌入式工程師去面試可能被問到的問題集錦

大家好,很高興和各位一起分享我的文章,喜歡和支持我的工程師,一定記得給我點(diǎn)贊、收藏、分享。

加微信[xyzn3333]與作者溝通交流,免費(fèi)獲取更多單片機(jī)與嵌入式的海量電子資料。

Q:什么是ISR?

A:ISR 是指中斷服務(wù)程序。 這些是存儲(chǔ)在特定內(nèi)存地址的函數(shù),當(dāng)發(fā)生某種類型的中斷時(shí)會(huì)調(diào)用這些函數(shù)。 Cortex-M 處理器系列具有管理中斷執(zhí)行的 NVIC

Q:我們可以給ISP傳遞參數(shù)或從ISR返回一個(gè)值嗎?為什么?

A:ISR 不返回任何內(nèi)容并且不允許傳遞任何參數(shù)。 

當(dāng)硬件或軟件中斷發(fā)生時(shí)會(huì)調(diào)用 ISR,它不會(huì)被任何代碼調(diào)用,所以這就是沒有參數(shù)傳遞到 ISR 的原因。因?yàn)樗粫?huì)被任何代碼調(diào)用,所以它不會(huì)有返回值。

Q:什么是 volatile 關(guān)鍵字?

A:volatile 關(guān)鍵字是一個(gè)類型限定符,可防止對(duì)象進(jìn)行編譯器優(yōu)化。根據(jù) C 標(biāo)準(zhǔn),具有 volatile 限定類型的對(duì)象可能會(huì)以實(shí)現(xiàn)未知的方式進(jìn)行修改或具有其他未知的副作用。您也可以說 volatile 限定對(duì)象的值可以隨時(shí)更改,而無需代碼采取任何操作。如果對(duì)象由 volatile 限定符限定,則每次程序訪問該對(duì)象時(shí),編譯器都會(huì)從內(nèi)存中重新加載該值,這意味著它可以防止將變量緩存到寄存器中。從內(nèi)存中讀取值是檢查值不可預(yù)測(cè)變化的唯一方法。

Q:標(biāo)準(zhǔn)C語(yǔ)言和嵌入式C語(yǔ)言有什么區(qū)別?

A:C語(yǔ)言:是一種通用編程語(yǔ)言,廣泛用于設(shè)計(jì)任何類型的基于桌面的應(yīng)用程序。 它是一種用于開發(fā)操作系統(tǒng)的系統(tǒng)編程語(yǔ)言。 C 語(yǔ)言的主要特點(diǎn)包括對(duì)內(nèi)存的低級(jí)訪問、一組簡(jiǎn)單的關(guān)鍵字和干凈的風(fēng)格,這些特點(diǎn)使 C 語(yǔ)言適用于操作系統(tǒng)或編譯器開發(fā)等系統(tǒng)編程。 本質(zhì)上它采用原生平臺(tái)開發(fā)方案,即它開發(fā)的應(yīng)用程序是平臺(tái)相關(guān)的,只能在單一平臺(tái)上使用。嵌入式 C:是標(biāo)準(zhǔn)C的擴(kuò)展,而不能說是標(biāo)準(zhǔn)C的一部分。嵌入式C語(yǔ)言用于開發(fā)基于微控制器的應(yīng)用程序。 嵌入式C語(yǔ)言對(duì)標(biāo)準(zhǔn)C的擴(kuò)展是I/O硬件尋址、定點(diǎn)算術(shù)運(yùn)算、訪問地址空間等。

Q:C 中的 const 和 volatile 限定符有什么區(qū)別?

A:const 關(guān)鍵字是編譯器強(qiáng)制執(zhí)行的,它表示程序無法更改對(duì)象的值,這意味著它使對(duì)象成為不可修改的類型。 讓我們看一個(gè)例子,

const int a = 0;

如果我們嘗試修改“a”的值,我們將得到編譯器錯(cuò)誤,因?yàn)?ldquo;a”用 const 關(guān)鍵字限定,防止更改“a”(整數(shù)變量)的值。

volatile 會(huì)阻止任何編譯器優(yōu)化,并表示對(duì)象的值可以被程序控制之外的東西更改,因此編譯器不會(huì)對(duì)對(duì)象做出任何假設(shè)。 看個(gè)例子,

    volatile int a;

    當(dāng)編譯器看到上面的聲明時(shí),它會(huì)避免對(duì)“a”做出任何假設(shè),并在每次迭代中從分配給“a”的地址讀取值。

    Q:C中的變量可以既是const又是volatile嗎?

    A:是的,可以同時(shí)使用 const 和 volatile。

    將 volatile 和 const 關(guān)鍵字一起使用的一個(gè)重要用途是在訪問 GPIO 寄存器時(shí)。在 GPIO被配置為輸入的情況下,讀取到的值將取決于外部因素(如開關(guān)或其他設(shè)備的輸出信號(hào))的改變。在這種情況下, volatile 發(fā)揮著重要作用,并確保編譯器始終從 GPIO 地址讀取值并避免做出任何優(yōu)化。使用 volatile 關(guān)鍵字后,無論何時(shí)訪問端口,您都會(huì)獲得正確的值,但仍然存在另一個(gè)問題,因?yàn)橹羔槻皇?const 類型,當(dāng)您的程序更改了指針的指向地址時(shí),所獲取的數(shù)值就是錯(cuò)誤的,這樣我們就必須創(chuàng)建一個(gè)帶有 volatile 關(guān)鍵字的常量指針。

    定義的用法為:

    int volatile * const PortRegister;

    理解:

    Q:常用的使用volatile的場(chǎng)合?

    A:1、訪問內(nèi)存映射外設(shè)寄存器或硬件狀態(tài)寄存器。

    #define COM_STATUS_BIT  0x00000006
    
    uint32_t const volatile * const pStatusReg = (uint32_t*)0x00020000;
    
    unit32_t GetRecvData()
    {
        unit32_t RecvData;
        
        //Code to receive data
        while (((*pStatusReg)  & COM_STATUS_BIT) == 0)
        {
            // Wait until flag does not set
            //Received data in RecvData
    
        }
        return RecvData;
    }

    2、在多個(gè)線程之間共享全局變量或緩沖區(qū)

    3、在中斷例程或信號(hào)處理程序中訪問全局變量

    volatile int giFlag = 0;
    
    ISR(void)
    {
        giFlag = 1;
    }
    
    int main(void)
    {
    
        while (!giFlag)
        {
            //do some work
        }
    
        return 0;
    }

    Q:什么是中斷延遲?

    A:中斷延遲是處理器響應(yīng)中斷請(qǐng)求所用的時(shí)鐘周期數(shù)。 這個(gè)時(shí)鐘周期數(shù)是在中斷請(qǐng)求的發(fā)生和中斷處理程序的第一條指令之間計(jì)數(shù)。

    Cortex-M 處理器的中斷延遲非常低。 在下表中列出了 Cortex-M 處理器的中斷延遲。

    Q:如何減少中斷延遲?

    A:中斷延遲取決于許多因素,我在下面的陳述中提到了一些因素。

    • 平臺(tái)和中斷控制器。
    • CPU 時(shí)鐘速度。
    • 定時(shí)器頻率
    • 緩存配置。
    • 應(yīng)用程序。

    因此,通過正確選擇平臺(tái)和處理器,我們可以輕松減少中斷延遲。 我們還可以通過縮短 ISR 并避免在 ISR 內(nèi)調(diào)用函數(shù)來減少中斷延遲。

    Q:在中斷服務(wù)程序(ISR) 中調(diào)用printf() 是否安全?

    A:不建議在接ISR中調(diào)用printf()

    Q:可以在 ISR 中放置斷點(diǎn)嗎?

    A:可以設(shè)置斷點(diǎn),但是不建議這么做。

    Q:在ISR中可以調(diào)用任何函數(shù)嗎?

    A:是的,但是不建議在中斷中直接調(diào)用函數(shù);建議在中斷中先設(shè)置相關(guān)標(biāo)志或執(zhí)行數(shù)據(jù)準(zhǔn)備,在主循環(huán)中進(jìn)行數(shù)據(jù)處理。

    Q:什么是中斷嵌套?

    A:在嵌套中斷系統(tǒng)中,即使正在執(zhí)行中斷服務(wù)函數(shù),也可以隨時(shí)隨地進(jìn)行中斷。 但是,只有最高優(yōu)先級(jí)的 ISR 會(huì)立即執(zhí)行。 優(yōu)先級(jí)次高的 ISR 將在最高優(yōu)先級(jí)的 ISR 完成后執(zhí)行。

    嵌套中斷系統(tǒng)的規(guī)則是:

    • 所有中斷都必須被設(shè)定中斷優(yōu)先級(jí)。
    • 初始化后,任何中斷都可以隨時(shí)隨地發(fā)生。
    • 如果低優(yōu)先級(jí) ISR 被高優(yōu)先級(jí)中斷中斷,則執(zhí)行高優(yōu)先級(jí) ISR。
    • 如果高優(yōu)先級(jí) ISR 被低優(yōu)先級(jí)中斷中斷,則高優(yōu)先級(jí) ISR 繼續(xù)執(zhí)行。
    • 必須按時(shí)間順序執(zhí)行相同優(yōu)先級(jí)的 ISR

    Q:ARM Cortex 中的NVIC是什么?

    A:Cortex-M 處理器系列中的嵌套向量中斷控制器 (NVIC) 是具有極其靈活的中斷優(yōu)先級(jí)管理的中斷控制器的一個(gè)示例。 它支持可編程優(yōu)先級(jí)、自動(dòng)嵌套中斷支持以及對(duì)多個(gè)中斷屏蔽的支持,同時(shí)仍然非常易于程序員使用。NVIC 的 Cortex-M3 和 Cortex-M4 處理器支持多達(dá) 240 個(gè)中斷輸入,具有 8 個(gè)多達(dá) 256 個(gè)可編程優(yōu)先級(jí)。

    Q:可以更改 Cortex-M 處理器系列的中斷優(yōu)先級(jí)嗎?

    A:可以。

    Q:什么是啟動(dòng)代碼,在進(jìn)入main函數(shù)前芯片都做了什么工作?

    A:芯片上電后,進(jìn)入 main 函數(shù)之前調(diào)用的代碼是啟動(dòng)代碼,一般是用匯編語(yǔ)言編寫的一小段代碼。啟動(dòng)代碼至少包括以下部分

    • 堆棧區(qū)的聲明
    • 堆區(qū)的聲明
    • 矢量表
    • 重置處理程序代碼
    • 其他異常處理程序代碼

    Q:如何訪問內(nèi)存的固定地址?

    A:

    //Memory address, you want to access
    #define RW_FLAG 0x1FFF7800
    
    //Pointer to access the Memory address
    volatile uint32_t *flagAddress = NULL;
    
    //variable to stored the read value
    uint32_t readData = 0;
    
    //Assign addres to the pointer
    flagAddress = (volatile uint32_t *)RW_FLAG;
    
    //Read value from memory
    * flagAddress = 12; // Write
    
    //Write value to the memory
    readData = * flagAddress;

    Q:什么是堆棧溢出?

    A:如果您的程序嘗試訪問超出可用堆棧內(nèi)存的限制,則會(huì)發(fā)生堆棧溢出。換句話說,如果調(diào)用堆棧指針超出堆棧邊界,則可以說發(fā)生堆棧溢出。如果發(fā)生堆棧溢出,程序可能會(huì)崩潰,或者可以說是堆棧溢出導(dǎo)致的分段錯(cuò)誤。

    Q:I2C和SPI的區(qū)別是什么?

    A:在嵌入式系統(tǒng)中,I2C和SPI都扮演著重要的角色。這兩種通信協(xié)議都是同步通信的例子,但仍然有一些重要的區(qū)別。I2C 和 SPI 通信協(xié)議之間的重要區(qū)別。

    • I2C 支持半雙工,而 SPI 是全雙工通信。
    • I2C 只需要兩線進(jìn)行通信,而 SPI 需要三線或四線進(jìn)行通信(取決于要求)。
    • 與 SPI 通信相比,I2C 速度較慢。
    • I2C 比 SPI 消耗更多功率。
    • I2C 比 SPI 更不易受噪聲影響。
    • 與 SPI 通信協(xié)議相比,I2C 的實(shí)現(xiàn)成本更低。
    • I2C 工作在線路和邏輯上,它有一個(gè)上拉電阻,而在 SPI 的情況下不需要上拉電阻。
    • 在 I2C 通信中,我們?cè)诿總€(gè)字節(jié)后獲得確認(rèn)位,SPI 通信協(xié)議不需要。
    • I2C 確保從設(shè)備接收發(fā)送的數(shù)據(jù),而 SPI 不驗(yàn)證數(shù)據(jù)是否正確接收。
    • I2C 支持多主機(jī)通信,而 SPI 不支持多主機(jī)通信。
    • I2C 和 SPI 之間的一大區(qū)別在于,I2C 支持同一總線上的多個(gè)設(shè)備,而無需任何額外的選擇線(基于設(shè)備地址工作),而 SPI 需要額外的信號(hào)(從選擇線)線來管理同一總線上的多個(gè)設(shè)備。
    • I2C 支持仲裁,而 SPI 不支持仲裁。
    • I2C 支持時(shí)鐘延長(zhǎng),而 SPI 不支持時(shí)鐘延長(zhǎng)。
    • I2C 可以被一個(gè)未能釋放通信總線的設(shè)備鎖定。
    • 由于起始位和停止位,I2C 有一些額外的開銷。
    • I2C 更適合長(zhǎng)距離,而 SPI 更適合短距離。

    Q:RS232和RS485有什么區(qū)別?

    A:RS232 和 RS485 之間的一些重要區(qū)別

    聲明:本內(nèi)容為作者獨(dú)立觀點(diǎn),不代表電子星球立場(chǎng)。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請(qǐng)聯(lián)系:editor@netbroad.com
    覺得內(nèi)容不錯(cuò)的朋友,別忘了一鍵三連哦!
    贊 3
    收藏 4
    關(guān)注 51
    成為作者 賺取收益
    全部留言
    0/200
    成為第一個(gè)和作者交流的人吧