嵌入式程式設計師需要了解的幾個問題

2020-12-05 電子產品世界
各位未來的嵌入式程式設計師,你想知道是否能夠成為一個出色的工程師,你是否想知道自己對嵌入式了解程度如何,那麼請關注一下我們接下來討論的問題。

   預處理器(Preprocessor)

  1. 用預處理指令#define 聲明一個常數,用以表明1年中有多少秒(忽略閏年問題)

  #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL

  我在這想看到幾件事情:

  1)。 #define 語法的基本知識(例如:不能以分號結束,括號的使用,等等)

  2)。 懂得預處理器將為你計算常數表達式的值,因此,直接寫出你是如何計算一年中有多少秒而不是計算出實際的值,是更清晰而沒有代價的。

  3)。 意識到這個表達式將使一個16位機的整型數溢出-因此要用到長整型符號L,告訴編譯器這個常數是的長整型數。

  4)。 如果你在你的表達式中用到UL(表示無符號長整型),那麼你有了一個好的起點。記住,第一印象很重要。

  2. 寫一個「標準」宏MIN,這個宏輸入兩個參數並返回較小的一個。

  #define MIN(A,B) ((A) 《= (B) ? (A) : (B))

  1)。 標識#define在宏中應用的基本知識。這是很重要的,因為直到嵌入(inline)操作符變為標準C的一部分,宏是方便產生嵌入代碼的唯一方法,對於嵌入式系統來說,為了能達到要求的性能,嵌入代碼經常是必須的方法。

  2)。 三重條件操作符的知識。這個操作符存在C語言中的原因是它使得編譯器能產生比if-then-else更優化的代碼,了解這個用法是很重要的。

  3)。 懂得在宏中小心地把參數用括號括起來

  4)。 我也用這個問題開始討論宏的副作用,例如:當你寫下面的代碼時會發生什麼事?least = MIN(*p++, b);

  3. 預處理器標識#error的目的是什麼?

  如果你不知道答案,請看參考文獻1。這問題對區分一個正常的夥計和一個書呆子是很有用的。只有書呆子才會讀C語言課本的附錄去找出象這種問題的答案。當然如果你不是在找一個書呆子,那麼應試者最好希望自己不要知道答案。

  死循環(Infinite loops)

  4. 嵌入式系統中經常要用到無限循環,你怎麼樣用C編寫死循環呢?

  這個問題用幾個解決方案。我首選的方案是:

  while(1)

  {

  }

  一些程式設計師更喜歡如下方案:

  for(;)

  {

  }

  這個實現方式讓我為難,因為這個語法沒有確切表達到底怎麼回事。如果一個應試者給出這個作為方案,我將用這個作為一個機會去探究他們這樣做的基本原理。如果他們的基本答案是:「我被教著這樣做,但從沒有想到過為什麼。」這會給我留下一個壞印象。

  第三個方案是用 goto

  Loop:

  。。.

  goto Loop;

  應試者如給出上面的方案,這說明或者他是一個彙編語言程式設計師(這也許是好事)或者他是一個想進入新領域的BASIC/FORTRAN程式設計師。

  數據聲明(Data declarations)

  5. 用變量a給出下面的定義

  a) 一個整型數(An integer)

  b) 一個指向整型數的指針(A pointer to an integer)

  c) 一個指向指針的的指針,它指向的指針是指向一個整型數(A pointer to a pointer to an integer)

  d) 一個有10個整型數的數組(An array of 10 integers)

  e) 一個有10個指針的數組,該指針是指向一個整型數的(An array of 10 pointers to integers)

  f) 一個指向有10個整型數數組的指針(A pointer to an array of 10 integers)

  g) 一個指向函數的指針,該函數有一個整型參數並返回一個整型數(A pointer to a function that takes an integer as an argument and returns an integer)

  h) 一個有10個指針的數組,該指針指向一個函數,該函數有一個整型參數並返回一個整型數( An array of ten pointers to functions that take an integer argument and return an integer )

  答案是:

  a) int a; // An integer

  b) int *a; // A pointer to an integer

  c) int **a; // A pointer to a pointer to an integer

  d) int a[10]; // An array of 10 integers

  e) int *a[10]; // An array of 10 pointers to integers

  f) int (*a)[10]; // A pointer to an array of 10 integers

  g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer

  h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer

  人們經常聲稱這裡有幾個問題是那種要翻一下書才能回答的問題,我同意這種說法。當我寫這篇文章時,為了確定語法的正確性,我的確查了一下書。但是當我被面試的時候,我期望被問到這個問題(或者相近的問題)。因為在被面試的這段時間裡,我確定我知道這個問題的答案。應試者如果不知道所有的答案(或至少大部分答案),那麼也就沒有為這次面試做準備,如果該面試者沒有為這次面試做準備,那麼他又能為什麼準備呢?

  Static

  6. 關鍵字static的作用是什麼?

  這個簡單的問題很少有人能回答完全。在C語言中,關鍵字static有三個明顯的作用:

  1)。 在函數體,一個被聲明為靜態的變量在這一函數被調用過程中維持其值不變。

  2)。 在模塊內(但在函數體外),一個被聲明為靜態的變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問。它是一個本地的全局變量。

  3)。 在模塊內,一個被聲明為靜態的函數只可被這一模塊內的其它函數調用。那就是,這個函數被限制在聲明它的模塊的本地範圍內使用。

  大多數應試者能正確回答第一部分,一部分能正確回答第二部分,同是很少的人能懂得第三部分。這是一個應試者的嚴重的缺點,因為他顯然不懂得本地化數據和代碼範圍的好處和重要性。

  Const

  7.關鍵字const是什麼含意?

  我只要一聽到被面試者說:「const意味著常數」,我就知道我正在和一個業餘者打交道。去年Dan Saks已經在他的文章裡完全概括了const的所有用法,因此ESP(譯者:Embedded Systems Programming)的每一位讀者應該非常熟悉const能做什麼和不能做什麼。如果你從沒有讀到那篇文章,只要能說出const意味著「只讀」就可以了。儘管這個答案不是完全的答案,但我接受它作為一個正確的答案。(如果你想知道更詳細的答案,仔細讀一下Saks的文章吧。)如果應試者能正確回答這個問題,我將問他一個附加的問題:下面的聲明都是什麼意思?

  const int a;

  int const a;

  const int *a;

  int * const a;

  int const * a const;

  前兩個的作用是一樣,a是一個常整型數。第三個意味著a是一個指向常整型數的指針(也就是,整型數是不可修改的,但指針可以)。第四個意思a是一個指向整型數的常指針(也就是說,指針指向的整型數是可以修改的,但指針是不可修改的)。最後一個意味著a是一個指向常整型數的常指針(也就是說,指針指向的整型數是不可修改的,同時指針也是不可修改的)。如果應試者能正確回答這些問題,那麼他就給我留下了一個好印象。順帶提一句,也許你可能會問,即使不用關鍵字const,也還是能很容易寫出功能正確的程序,那麼我為什麼還要如此看重關鍵字const呢?我也如下的幾下理由:

  1)。 關鍵字const的作用是為給讀你代碼的人傳達非常有用的信息,實際上,聲明一個參數為常量是為了告訴用戶這個參數的應用目的。如果你曾花很多時間清理其它人留下的垃圾,你就會很快學會感謝這點多餘的信息。(當然,懂得用const的程式設計師很少會留下垃圾讓別人來清理的。)

  2)。 通過給優化器一些附加的信息,使用關鍵字const也許能產生更緊湊的代碼。

  3)。 合理地使用關鍵字const可以使編譯器很自然地保護那些不希望被改變的參數,防止其被無意的代碼修改。簡而言之,這樣可以減少bug的出現。

  Volatile

  8. 關鍵字volatile有什麼含意?並給出三個不同的例子。

  一個定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。精確地說就是,優化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器裡的備份。下面是volatile變量的幾個例子:

  1)。 並行設備的硬體寄存

相關焦點

  • 程式設計師及嵌入式的一些學習建議
    計算機相關專業數學等理工科畢竟經過四年的理論基礎邏輯思維的薰陶,經過幾個月的培訓,基本上就可以上手開發了。2、作為程式設計師,學習能力也是很重要的,如果在學第一門程式語言的時候不能在半個月內,寫出象樣的小程序,你不能入這行。
  • 想成為嵌入式程式設計師應知道的0x10個基本問題
    C語言測試是招聘嵌入式系統程式設計師過程中必須而且有效的方法。這些年,我既參加也組織了許多這種測試,在這過程中我意識到這些測試能為帶面試者和被面試者提供許多有用信息,此外,撇開面試的壓力不談,這種測試也是相當有趣的。從被面試者的角度來講,你能了解許多關於出題者或監考者的情況。
  • 嵌入式程式設計師如何發展成全棧工程師
    嵌入式開發是物聯網開發體系結構中的重要一環,未來隨著物聯網的發展,嵌入式開發的發展空間還是非常值得期待的,尤其在產業網際網路發展的推動下,嵌入式開發的應用領域將得到進一步的拓展。對於嵌入式程式設計師來說,如果想成長為全棧工程師,應該做好以下幾件事:第一:設計全棧開發方向。對於嵌入式程式設計師來說,應該以物聯網體系為依託設計全棧開發方向。物聯網體系包括六個大的技術組成部分,分別是設備、網絡、平臺、分析、應用和安全,其中嵌入式程式設計師處於設備層,下一步可以繼續往上發展來設計全棧路線。簡單的說,接下來應該學習雲計算、大數據相關知識。
  • 嵌入式工程師常見面試題大集合,找工作面試很重要
    上個星期,去深圳一家搞ARM開發的公司面試,HR叫我做了一份卷子,裡面都是C編程,心中暗喜,因為這些題基本上都在程式設計師面試寶典裡見過。因為在 嵌入(inline)操作符 變為標準C的一部分之前,宏是方便產生嵌入代碼的唯一方法,對於嵌入式系統來說,為了能達到要求的性能,嵌入代碼經常是必須的方法。  2) 三重條件操作符的知識。這個操作符存在C語言中的原因是它使得編譯器能產生比if-then-else更優的代碼,了解這個用法是很重要的。  3) 懂得在宏中小心地把參數用括號括起來。
  • 計算機四級嵌入式系統開發工程師模擬試題(1)
    一、編程開發能力:     1、用預處理指令#define聲明一個常數,用以表明一年中有多少秒(忽略閏年問題);寫一個「標準」宏MIN函數,這個宏輸入兩個參數並返回較小的一個。     4、嵌入式系統總是要用戶對變量或寄存器進行位操作,給定一個整型變量a,寫兩段代碼,第一個設置a 的bit 3,第二個清除a 的bit 3,在以上操作中,要保持其他位不變。     5、嵌入式系統經常具有要求程式設計師去訪問某特定的內存位置的特點,在某工程中,要去設置一絕對地址為0x67a9的整型變量的值為0xaa66。
  • 程式設計師編程入門必知!程式設計師需要學什麼
    編程就是讓計算機為解決某個問題而使用某種程序設計語言編寫程序代碼,並最終得到結果的過程。資訊時代的大背景下,計算機的應用顯得舉足輕重,精通計算機的人才對於龐大的市場需求量來說還是顯得很匱乏,因此計算機行業的前景是很可觀的,但是也有不少人對於編程處於一竅不通的狀態,那編程該從何入手呢?
  • 程式設計師是做什麼的?未來計算機變得智能,就不需要程式設計師了嗎?
    很多人認為計算機變得如此智能,所以在不久的未來將不再需要程式設計師。另外一些人認為程式設計師是天才,他們在電腦前能不斷地解決複雜的數學難題。–Bill Watterson 人類的問題是,他們只是人而已。——比爾·沃特森 人類是生物進化的產物,並且擁有獨特而寶貴的器官——大腦,它能為程式設計師提供想法。大腦有組合複雜的新大腦皮層(對人類而言是獨特的),還有從哺乳動物和爬行動物繼承的舊結構。舊的大腦結構主要負責生殖(性)和生存(尋找食物或者躲避危險)。
  • C++在嵌入式應用中的安全問題
    嵌入式系統的軟體設計中,「彙編語言+C語言」早已成為理所當然的經典組合。的確,對於硬體配置來說,彙編語言清晰明了;對於上層設計來說,C語言緊湊高效。這樣的搭配能夠滿足大多數傳統嵌入式系統應用的需要。本文引用地址:http://www.eepw.com.cn/article/150695.htm  由此帶來的在語言使用中的安全問題,目前雖然還未凸顯,但根據以往的經驗來看,終將成為限制行業發展的新瓶頸。
  • 轉行做程式設計師需要具備哪些條件
    很多轉行的人都會考慮這個問題,下面小編為大家介紹轉行做程式設計師需要具備的條件。一、注重細節如果做事情不注重細節,那麼最好不要做程式設計師。細節在工作中是非常重要的,無論從邏輯方面還是編寫代碼方面,都需要注重細節,在IT方面是不存在差不多的。如果在代碼方面出現細節的錯誤,那將嚴重影響全局。
  • 智能硬體風口 廣東新支點推嵌入式作業系統
    3、 增加菜單配置項中興新支點嵌入式作業系統的bootloader增加了菜單配置選項功能,大大簡化了開發人員開發的難度。用戶只需要通過菜單配置選項,配置bootloader的功能,而無需要用戶手動修改uboot的配置宏。
  • 程式設計師需要什麼學歷 超全經驗 看這一篇就夠了
    程式設計師需要什麼學歷?最近有一些朋友想從事電腦程式領域,問到我程式設計師的起點高嗎?程式設計師需要什麼學歷?接下來殷老師針對這個問題詳細分享下自己的看法! 一、程式設計師需要什麼學歷?
  • 五年,我成為了一名嵌入式工程師。
    這期間,我學習了網站建設、計算機輔助技術、嵌入式開發、自動化與工業控制以及數字電路等等。我沒有特別仔細的研讀,也刻意不去了解技術細節,目的是抽絲剝繭找到自己的最終方向。 選擇嵌入式軟體,看重的是物聯網,也因為自己喜歡底層開發,與硬體打交道樂此不疲。在單片機和嵌入式 Linux 這兩塊,我優先選擇了單片機開發,將 Linux 往後放一放。
  • 在VIM中實現對嵌入式軟體的調試
    其強大的gdb調試工具可以方便地對嵌入式平臺上的程序進行跟蹤調試;而Linux下強悍的VIM編輯器,不僅可以方便地調用make文件對代碼進行編譯,而且通過腳本的配置還可輕鬆地成為高效的代碼編輯環境。流傳著這樣一種說法,「世界上的程式設計師分三種,一種使用Emacs,一種使用VIM,剩餘的是其他。」不去辯論這句話的對與錯,單純從字面意義上來理解,也足見VIM的魅力了。
  • ARM開發教程之ARM體系的嵌入式系統BSP的程序設計
    所以這就要求BSP程式設計師對硬體、軟體和作業系統都要有一定的了解。   本文介紹基於ARM體系的嵌入式應用系統初始化部分BSP的程序設計。本文引用的源碼全部是基於HMS320C7202晶片設計,並已成功運行。
  • 中國程式設計師 VS 美國程式設計師,差距就在這五點
    什麼技術火就學什麼,然後進入一個大公司,做幾個成功的項目,積累工作經驗,幾年以後自己當個小管理,拿著十幾萬,或幾十萬的工資,再無追求的過著小日子就好。甚至到了30歲,如果沒能進入管理層,大多數人都會考慮轉行,或僅靠自身的知識累積開始創業。美國程式設計師大多數都是因為熱愛編程行業而從事這份工作的,他們會專注某一個領域幾十年。
  • 是什麼成就了一名「高級」程式設計師?
    除多年編程經驗之外,還有什麼能區分一個程式設計師是「老手」還是「新手」?編程技巧當然是一部分,但它絕非是全部。聰明的程式設計師可能比他們的同行擁有更出眾的編程技巧,但那不足以說明他們就是「老手」。同樣,僅僅因為擁有10年編程經驗也並不意味著他們就是高手。在工作崗位上,擁有多年編程經驗也不能說明問題。即便沒被炒魷魚,那也不能提升你的價值。
  • 嵌入式實時資料庫技術研究
    劉 震:博士,主要從事計算機測控、嵌入式系統及故障診斷等方面的研究;羅 欣,博士,主要從事圖象處理與模式識別、嵌入式系統等方面的研究。摘要:對嵌入式實時資料庫系統的功能進行了分析,研究了嵌入式實時資料庫系統的結構及特性,探討了在嵌入式環境下進行實時資料庫設計的內容及需要解決的相關問題,最後給出了一個基於VxWorks的嵌入式實時資料庫開發的應用實例。
  • 高級程式設計師是如何從初級程式設計師演變的?工作經驗不再是唯一途徑!
    但這些測試充其量也只是了解一個大概,無法度量其究竟具備多少完成該項工作所需的經驗或專業技能。 這就引出了下一個問題。 一旦你不再是初級程式設計師,什麼時候會成為高級程式設計師呢? 多年的工作經驗會自動讓你成為高級程式設計師嗎?未必。
  • 誰是更好的程式設計師:中國人還是印度人?
    RKKSJust enough coder,Computer Technologist計算機技術專家事實上,為了確保我能正確理解這個問題,我瀏覽了這個問題最受關注和投票最多的答案。我認為,這些他們的論點和結論至少可以說是毫無根據的。以下是我的不同的觀點。為了回答這個問題,我們需要知道「更好的程式設計師」是什麼意思。
  • 最新1月份嵌入式軟體開發工程師工資17328元!
    2021年1月全國程式設計師平均工資14915元,工資中位數12500元。 程式設計師月收入變化走勢圖 本月程式設計師工資是上漲趨勢,比2020年12個月都高,接近¥15000.00的高點。