嵌入式面試題(一)

目錄

            • 1 關鍵字volatile有什么含義?并給出三個不同的例子
            • 2. c和c++中的struct有什么不同?
            • 3.進程和線程區別
            • 4.ARM流水線
            • 5.使用斷言
            • 6 .嵌入式系統的定義
            • 7 局部變量能否和全局變量重名?
            • 8 如何引用一個已經定義過的全局變量?
            • 9、全局變量可不可以定義在可被多個.C 文件包含的頭文件中?為什么?
            • 10 static 全局變量與普通的全局變量有什么區別?static 局部變量和普通局部變量有什么區別?static 函數與普通函數有什么區別?

1 關鍵字volatile有什么含義?并給出三個不同的例子

防止編譯器優化,如果你不知道這個關鍵字,那么你可能不是一個合格的嵌入式軟件工程師。

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

 1). 并行設備的硬件寄存器(如:狀態寄存器)2). 一個中斷服務子程序中會訪問到的非自動變量(Non-automatic variables)+3). 多線程應用中被幾個任務共享的變量

嵌入式系統程序員經常同硬件、中斷、RTOS等等打交道,所用這些都要求volatile變量。不懂得volatile內容將會帶來災難。
  假設被面試者正確地回答了這是問題(嗯,懷疑這否會是這樣),我將稍微深究一下,看一下這家伙是不是直正懂得volatile完全的重要性。
  1). 一個參數既可以是const還可以是volatile嗎?解釋為什么。
  2). 一個指針可以是volatile 嗎?解釋為什么。
  3). 下面的函數有什么錯誤:

  int square(volatile int *ptr){return *ptr * *ptr;}

下面是答案:
  1). 是的。一個例子是只讀的狀態寄存器。它是volatile因為它可能被意想不到地改變。它是const因為程序不應該試圖去修改它。
  2). 是的。盡管這并不很常見。一個例子是當一個中斷服務子程序修改一個指向一個buffer的指針時。
  3). 這段代碼的有個惡作劇。這段代碼的目的是用來返指針ptr指向值的平方,但是,由于ptr指向一個volatile型參數,編譯器將產生類似下面的代碼:

  int square(volatile int *ptr){int a,b;a = *ptr;b = *ptr;return a * b;}

由于*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結果,這段代碼可能返不是你所期望的平方值!正確的代碼如下:

  long square(volatile int *ptr){int a;a = *ptr;return a * a; 
2. c和c++中的struct有什么不同?

答: c和c++中struct的主要區別是c中的struct不可以含有成員函數,而c++中的struct可以。c++中struct和class的主要區別在于默認的存取權限不同,struct默認為public,而class默認為private.

3.進程和線程區別

(1)進程是系統分配資源的最小單位,線程是程序最小的執行單元
(2)一個進程至少有一個線程,各個線程之間共享資源
(3)進程的創建調用fork或vfork,線程的創建調用pthread_create,進程結束后
所有的線程都會銷毀,線程的結束并不會影響進程
(4)線程是輕量級的進程,創建和銷毀所需要的時間都比進程小
(5)線程中執行時一般都要進行同步和互斥,因為他們共享同一進程的所有資源

4.ARM流水線

arm7—馮諾依曼結構—3級:取指,譯碼,執行。
arm9—哈佛結構—5級:取指、譯碼、執行、訪存、回寫。

5.使用斷言

assert()宏是用于保證滿足某個特定條件,用法是:
assert(表達式);
如果表達式的值為假,整個程序將退出,并輸出一條錯誤信息。如果表達式的值為真則繼續執行后面的語句。
使用這個宏前需要包含頭文件assert.h

6 .嵌入式系統的定義

嵌入式系統以應用為中心,以半導體技術、控制技術計算機技術和通訊技術為基礎,強調硬件軟件的協同性與整合性,軟件與硬件可剪裁,以滿足系統對功能、成本、體積和功耗等要求。

7 局部變量能否和全局變量重名?

答:能,局部會屏蔽全局。要用全局變量,需要使用"::" ;局部變量可以與全局變量同名,
在函數內引用這個變量時,會用到同名的局部變量,而不會用到全局變量。對于有些編譯器
而言,在同一個函數內可以定義多個同名的局部變量,比如在兩個循環體內都定義一個同名
的局部變量,而那個局部變量的作用域就在那個循環體內。

8 如何引用一個已經定義過的全局變量?

答:可以用引用頭文件的方式,也可以用extern 關鍵字,如果用引用頭文件方式
來引用某個在頭文件中聲明的全局變量,假定你將那個變量寫錯了,那么在編譯期間會報錯,
如果你用extern 方式引用時,假定你犯了同樣的錯誤,那么在編譯期間不會報錯,而在連
接期間報錯。

9、全局變量可不可以定義在可被多個.C 文件包含的頭文件中?為什么?

答:可以,在不同的C 文件中以static 形式來聲明同名全局變量。可以在不同的C 文
件中聲明同名的全局變量,前提是其中只能有一個C 文件中對此變量賦初值,此時連接不會
出錯.

10 static 全局變量與普通的全局變量有什么區別?static 局部變量和普通局部變量有什么區別?static 函數與普通函數有什么區別?

答: 1) 全局變量(外部變量)的說明之前再冠以static 就構成了靜態的全局變量。全局變
量本身就是靜態存儲方式,靜態全局變量當然也是靜態存儲方式。這兩者在存儲方式上并
無不同。這兩者的區別在于非靜態全局變量的作用域是整個源程序,當一個源程序由多個源
文件組成時,非靜態的全局變量在各個源文件中都是有效的。而靜態全局變量則限制了其
作用域,即只在定義該變量的源文件內有效,在同一源程序的其它源文件中不能使用它。由
于靜態全局變量的作用域局限于一個源文件內,只能為該源文件內的函數公用,因此可以避
免在其它源文件中引起錯誤。
2) 從以上分析可以看出, 把局部變量改變為靜態變量后是改變了它的存儲方式即改變
了它的生存期。把全局變量改變為靜態變量后是改變了它的作用域,限制了它的使用范
圍。
3) static 函數與普通函數作用域不同,僅在本文件。只在當前源文件中使用的函數應該說明為內部函數(static),內部函數應該在當前源文件中說明和定義。對于可在當前源文件以外使用的函數,應該在一個頭文件中說明,要使用這些函數的源文件要包含這個頭文件
綜上所述:
static 全局變量與普通的全局變量有什么區別:
static 全局變量只初使化一次,防止在其他文件單元中被引用;
static 局部變量和普通局部變量有什么區別:
static 局部變量只被初始化一次,下一次依據上一次結果值;可以返回其地址 其值不可以改
static 函數與普通函數有什么區別:
static 函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/531396.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531396.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531396.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

能ping通ip但無法ping通域名和localhost //ping: bad address 'www.baidu.com'

錯誤描述: ~ # ping localhost ping: bad address localhost原因,在/etc目錄下缺少hosts文件,將linux中的/etc hosts文件拷入即可 ~ # ping localhost PING localhost (127.0.0.1): 56 data bytes 64 bytes from 127.0.0.1: seq0 ttl64 tim…

eclipse導入web項目之后項目中出現小紅叉解決辦法

項目中有小紅叉我遇到的最常見的情況: 1、項目代碼本身有問題。(這個就不說了,解決錯誤就OK) 2、項目中的jar包丟失。(有時候eclipse打開時會出現jar包丟失的情況,關閉eclipse重新打開或者重新引入jar包就O…

arm開發板通過網線連接筆記本電腦上外網

需要工具:arm開發板,網線,一臺雙網卡的win7筆記本電腦(筆記本電腦一般都是雙網卡) 一、筆記本電腦需要先連上外網,可以連上家里的WIFI,或者手機開熱點(本人未測試過連接手機的熱點&…

windows下實現Git在局域網使用

1.首先在主機A上創建一個文件夾用于存放你要公開的版本庫。然后進入這個文件夾,右鍵->Git create repository here,彈出的窗口中勾選Make it Bare!之后將這個文件夾完全共享(共享都會吧?注意權限要讓使用這個文件夾…

解決linux下QtCreator無法輸入中文的情況

安裝了QtCreator(Qt5.3.1自帶版本)后無法輸入中文,確切的說是無法打開輸入法。以前使用iBus輸入法的時候沒有這個問題,現在使用sougou輸入法才有的這個問題。 可以查看此文 http://www.cnblogs.com/oloroso/p/5114041.html 原因 有問題就得找原因&…

lintcode 滑動窗口的最大值(雙端隊列)

題目鏈接:http://www.lintcode.com/zh-cn/problem/sliding-window-maximum/# 滑動窗口的最大值 給出一個可能包含重復的整數數組,和一個大小為 k 的滑動窗口, 從左到右在數組中滑動這個窗口,找到數組中每個窗口內的最大值。 樣例 給出數組 [1…

你的main函數規范嗎?

在學習c語言的時候,有一個函數一直被我們使用,那就是main函數,但是你知道標準里面是怎么規定它的寫法嗎? 平時看見的main函數有下面這幾種: 1.int main(void){ }2.int main(){ }3.int main(int argc, char *argv[])…

lintcode 最長上升連續子序列 II(二維最長上升連續序列)

題目鏈接:http://www.lintcode.com/zh-cn/problem/longest-increasing-continuous-subsequence-ii/ 最長上升連續子序列 II 給定一個整數矩陣(其中,有 n 行, m 列),請找出矩陣中的最長上升連續子序列。&a…

適用于Linux的Windows子系統WSL

以前使用的都是在虛擬機里安裝linux,最近才發現在win10提供了WSL(Windows Subsystem for Linux) ,簡單來說就是可以在win10里面直接使用Linux。 (一)首先打開Microsoft Store , 搜索 Linux (二)選擇自己需…

jsp通過易寶方式實現在線支付

項目下載地址: https://github.com/hjzgg/OnlinePayment 參考:http://blog.csdn.net/jadyer/article/details/7380259?utm_sourcetuicool&utm_mediumreferral 效果圖1:請求界面 效果圖2:地支付請求和易寶之間建立連接之后跳轉到相應的銀…

permission denied是什么鬼?

問題:在PC端編譯了一個arm芯片的測試程序,出現了permission denied 解決辦法: 1.給文件賦予可執行權限 chmod ax xxx這是一般第一反應會想到的答案 2. 有時候已經有可執行權限,還是提示上面的錯誤此時要注意你的交叉編譯器是否正…

CSS中div覆蓋另一個div

將一個div覆蓋在另一個div上有兩種手段&#xff1a;一是設置margin為負值&#xff0c;二是設置絕對定位。 可以根個人情況設置z-index的值 1->position 為absolute的情況 <html> <head> <style> #div1{position:absolute;width:300px;height:300px;backgr…

nand flash和nor flash的這幾點區別你知道嗎?

這篇文章講解nand flash和nor flash的特點和區別&#xff0c;不涉及存儲原理的講解 &#xff08;一&#xff09;Flash簡介 FLASH是一種存儲芯片&#xff0c;全名叫Flash EEPROM Memory&#xff0c;通地過程序可以修改數據&#xff0c;即平時所說的“閃存”。Flash又分為NAND f…

c++堆

c reference: http://www.cplusplus.com/reference/algorithm/make_heap/ heap并不屬于STL容器組件&#xff0c;它分為 max heap 和min heap&#xff0c;在缺省情況下&#xff0c;max-heap是優先隊列&#xff08;priority queue&#xff09;的底層實現機制。 而這個實現機制中的…

關于Ubuntu拒絕root用戶ssh遠程登錄

今天使用SecureCRT遠程登陸Ubuntu時一直提示密碼或用戶名錯誤&#xff0c;實際輸入是正確的&#xff0c;我按照網上教程改還是不行&#xff0c;后來才想起來我是root登錄的&#xff0c;Ubuntu默認的ssh遠程root登錄是關閉的&#xff0c;在這里記錄一下 1.編輯配置文件 #sudo v…

windows8建立局域網的方法

win8建立局域網的方法&#xff1a;1、首先筆記本有無線網卡且支持 虛擬WIFI ;2、按winX鍵&#xff0c;選擇"命令提示符(管理員)A"; 3、輸入"netsh wlan set hostednetwork modeallow ssid網絡名稱 key我的密碼" ; 4、接著輸入"netsh wlan start hoste…

內核移植出現:Kernel panic - not syncing: No init found.

今天在升級SDK的時候&#xff0c;升級到kernel時遇到如題所述的問題&#xff0c;花了天時間調通&#xff0c;在這里記錄一下。 報錯提示&#xff1a;(當時沒有記錄&#xff0c;錯誤的提示大概如下) Kernel panic - not syncing: No init found. Try passing init option to k…

lintcode Permutation Index

題目&#xff1a;http://www.lintcode.com/zh-cn/problem/permutation-index/ 排列序號 給出一個不含重復數字的排列&#xff0c;求這些數字的所有排列按字典序排序后該排列的編號。其中&#xff0c;編號從1開始。 樣例 例如&#xff0c;排列[1,2,4]是第1個排列。 思路&#xf…

32位和64位機器上C語言數據類型的大小

作為嵌入式開發的人員&#xff0c;是必須了解C語言在不同位數機器上占用的字節大小的&#xff0c;下面做下對比 不同位數平臺對比&#xff1a; \16位平臺32位平臺64位平臺char1個字節8位1個字節8位1個字節short2個字節16位2個字節16位2個字節int2個字節16位4個字節32位 4個字節…

lintcode循環數組之連續子數組求和

v 題目&#xff1a;連續子數組求和 II給定一個整數循環數組&#xff08;頭尾相接&#xff09;&#xff0c;請找出一個連續的子數組&#xff0c;使得該子數組的和最大。輸出答案時&#xff0c;請分別返回第一個數字和最后一個數字的值。如果多個答案&#xff0c;請返回其中任意一…