




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、菲 菱 科 思 內(nèi) 部 資 料 , 注 意 保 密菲 菱 科 思 內(nèi) 部 資 料 , 注 意 保 密LinuxLinux編程知識(shí)編程知識(shí)主要內(nèi)容 Linux編程的風(fēng)格及與編程的風(fēng)格及與COMWARE的比較的比較 Linux程序的常見概念程序的常見概念 Linux Make的使用的使用Linux編程的風(fēng)格編程的風(fēng)格變量類型:Linux的更直觀:u_int32_t VS ULONG變量命名:Linux采用全小寫,簡(jiǎn)短,但對(duì)英語要求較高COMWARE;采用的是匈牙利命名法,容易理解,但長(zhǎng)度較長(zhǎng)控制塊的使用:COMWARE是強(qiáng)制要求if、else等后面必須有,不容易出錯(cuò);而Linux是能不用則不用,且
2、盡量多容納有效行函數(shù)返回值:功能性的函數(shù),Linux一般是0返回正確,小于0的是出錯(cuò);COMWARE是VOS_OK正確,VOS_ERR錯(cuò)誤常數(shù)的使用:Linux使用常數(shù)的地方較多,需聯(lián)系上下文才能看懂;COMWARE是提倡用有意義的宏來代替,能夠顧名思義.Linux用的是最新gcc編譯器,支持C99,可變宏、更多的關(guān)鍵字,等等,編碼更靈活;COMWARE僅支持ANSI C89總之,Linux是天才們的編碼,更追求技術(shù);COMWARE是普通人的編碼,更追求穩(wěn)定Linux程序的常見概念程序的常見概念(一一)進(jìn)程:亦可稱為任務(wù)。Linux下的進(jìn)程互不影響,各自使用獨(dú)立的空間,由CPU、OS共同負(fù)責(zé)內(nèi)
3、存保護(hù)、任務(wù)切換;COMWARE使用相同的地址空間,能夠互相訪問,因此也會(huì)發(fā)生踩內(nèi)存的現(xiàn)象。COMWARE下啟動(dòng)任務(wù)是VOS_T_Create函數(shù),通常是任務(wù)A調(diào)用該函數(shù)來啟動(dòng)B,兩者代碼通常不相同。Linux是fork函數(shù)來啟動(dòng)子進(jìn)程。通常返回值PID來區(qū)分:1、返回值是0,則是子進(jìn)程,子進(jìn)程可以通過getpid來獲取自身PID2、返回值是-1,表明創(chuàng)建任務(wù)出錯(cuò)3、其它,則是父進(jìn)程,并得到了子進(jìn)程的PIDLinux程序的常見概念程序的常見概念(一一)fork代碼常見形式: . if ( (pid = fork() = 0 ) /* Child process */ else if (pid
4、= -1) /* Error Handler */ else /* Parent process */ .Linux程序的常見概念程序的常見概念(二二)線程:可以說是輕量級(jí)的進(jìn)程。創(chuàng)建一個(gè)線程比創(chuàng)建一個(gè)進(jìn)程的開銷少得多。同一個(gè)進(jìn)程下的線程可以共享父進(jìn)程的所有資源,很方便地實(shí)現(xiàn)線程間的通訊。COMWARE不支持。Linux下用得也較少。Windows下用得最多。線程通常是用來UI和Function分離:主線程負(fù)責(zé)從圖形化界面上接收用戶的數(shù)據(jù),并將其傳給對(duì)應(yīng)的子線程。子線程負(fù)責(zé)接收數(shù)據(jù)并計(jì)算,并將結(jié)果返回給主線程,由主線程顯示給用戶。好處:避免了長(zhǎng)時(shí)間的計(jì)算,用戶無法進(jìn)行控制。缺點(diǎn):編碼時(shí)需要考慮
5、同步、互斥的問題。Miniware短時(shí)間內(nèi)不會(huì)用到線程。有興趣的可參考pthread_createLinux程序的常見概念程序的常見概念(三三)共享鏈接庫(kù):共享一份代碼,數(shù)據(jù)各自獨(dú)立,更常用的是COW-Copy on Write與可執(zhí)行文件的區(qū)別:不能直接運(yùn)行,不需要main函數(shù)編譯共享鏈接庫(kù)時(shí),需要使用-fPIC和-shared別的程序要使用,編碼時(shí)需要提供頭文件,聲明各函數(shù);鏈接時(shí),需要-L給出鏈接庫(kù)的目錄以及-l給出鏈接庫(kù)的名稱程序運(yùn)行時(shí),由OS負(fù)責(zé)裝入-fPIC:Position-Independent Code:Access all constant addresses throug
6、h a Global Offset Table與靜態(tài)庫(kù)的區(qū)別:靜態(tài)庫(kù)的代碼是編譯鏈接時(shí)使用,而且用哪些鏈接哪些,使用一次鏈接一次,編譯鏈接后直接存在于可執(zhí)行文件中,類似于C語言中的#define;共享鏈接庫(kù)是運(yùn)行時(shí)加載,鏈接時(shí)放在可執(zhí)行文件的是文件名和代碼起始地址(或函數(shù)名),類似于C語言的函數(shù)調(diào)用Linux程序的常見概念程序的常見概念(三三)對(duì)于Miniware來說,靜態(tài)庫(kù)的代碼已經(jīng)是vmlinux.64文件中可執(zhí)行文件的一部分;而共享鏈接庫(kù)的代碼則是vmlinux.64文件中不可執(zhí)行的文件,放在ram fs,執(zhí)行時(shí)才會(huì)用到。COMWARE沒有共享鏈接庫(kù)的說法。Linux還可以動(dòng)態(tài)加載共享鏈
7、接庫(kù),但需要程序員的額外編碼。避免了一開始就加載,但后續(xù)用不到的浪費(fèi)(比如if分支加載不同的動(dòng)態(tài)鏈接庫(kù))。Linux下是dlopen、dlsym;Miniware基本不需要用到該特性。Linux程序的常見概念程序的常見概念(四四)信號(hào)量:用于訪問全局資源的互斥、進(jìn)程間同步的手段。本質(zhì)是非負(fù)的整數(shù)計(jì)數(shù)器。使用者在訪問全局資源前,首先需要去獲取一個(gè)信號(hào),如果計(jì)數(shù)器大于0,則使用者可以獲取成功;否則的話,使用者的任務(wù)將會(huì)被掛起;獲取信號(hào)量成功后,可以開始訪問全局資源;訪問結(jié)束后,應(yīng)當(dāng)及時(shí)釋放,使得在其上面阻塞的任務(wù)能夠盡快得到調(diào)度。如果計(jì)數(shù)器初始化為1,且只有兩個(gè)競(jìng)爭(zhēng)者,則是互斥的典型現(xiàn)象。Linu
8、x程序的常見概念程序的常見概念(四四)sem_init:用于初始化一個(gè)信號(hào)量sem_wait:獲取信號(hào)量,如果計(jì)數(shù)器當(dāng)前大于0,則獲取成功,否則任務(wù)被掛起sem_trywait:獲取信號(hào)號(hào),與sem_wait的區(qū)別是獲取不成功,不會(huì)被掛起sem_post:釋放信號(hào)量,訪問全局資源后,應(yīng)當(dāng)及時(shí)釋放上述函數(shù)僅用于Linux線程間的同步Linux程序的常見概念程序的常見概念(四四)semget:用于初始化一個(gè)信號(hào)量semop:操作一個(gè)信號(hào)量,獲取還是釋放semctl:控制一個(gè)信號(hào)量,通常初始化初值或者釋放信號(hào)量所使用的內(nèi)核資源上述函數(shù)可用于Linux進(jìn)程間的同步Linux程序的常見概念程序的常見概念
9、(四四)#define MY_KEY 5555struct sembuf operation1 ;union semun int val; struct semid_ds *buf; USHORT *array; semctl_arg,ignored_argument;int semidsemid = semget(MY_KEY, 1, IPC_CREATE);/Set Initial value for the resource - initially one process ownedsemctl_arg.val = 1; /Setting semval to 1semctl(semid,
10、 0, SETVAL, semctl_arg);Linux程序的常見概念程序的常見概念(四四)/ get semaphoreoperation0.sem_op = -1;operation0.sem_num = 0;operation0.sem_flg = IPC_WAIT;semop(semid, operation,1);/ access global shared resource/ release semaphoreoperation0.sem_op = 1;operation0.sem_num = 0;operation0.sem_flg = IPC_WAITsemop(semid,
11、 operation,0);/ close semaphoresemctl(semid, 1, IPC_RMID , ignored_argument);Linux程序的常見概念程序的常見概念(四四)內(nèi)核的鎖:通常來說,內(nèi)核很少會(huì)用到信號(hào)量,更多的是用到讀寫同步鎖使用宏DEFINE_RWLOCK(lockname)來定義一個(gè)鎖使用write_lock_bh、write_unlock_bh和read_lock_bh、read_lock_bh來上鎖、解鎖自旋鎖用得也很多:spin_lock、spin_unlockLinux程序的常見概念程序的常見概念(四四)COMWARE由于任務(wù)是互斥的,通常不必
12、考慮互斥,進(jìn)程間通信基本是基于消息隊(duì)列Linux的System V是從Unix學(xué)習(xí)而來的,函數(shù)的控制參數(shù)多帶有IPC字段Windows的對(duì)信號(hào)量、事件、互斥量等,函數(shù)名、函數(shù)參數(shù)上各自獨(dú)立,有較好的理解性Linux程序的常見概念程序的常見概念(五五)共享內(nèi)存:進(jìn)程間通信的常用方法創(chuàng)建一塊共享內(nèi)存:int shmget(key_t key,int size,int shmflg);其中key必須是唯一,并且這組進(jìn)程調(diào)用該函數(shù)時(shí),key必須相同。否則的話,得到的共享內(nèi)存,也許屬于別的進(jìn)程。shmflg通常是IPC_CREAT,表示不存在該共享內(nèi)存時(shí)則創(chuàng)建,存在的話則去打開。除非失敗,否則都會(huì)得到該
13、內(nèi)存的描述符Linux程序的常見概念程序的常見概念(五五)得到描述符后,通常調(diào)用shmat,把當(dāng)前進(jìn)程與該共享內(nèi)存關(guān)聯(lián)起來。int shmat ( int shmid, char *shmaddr, int shmflg);后兩個(gè)參數(shù)通常填0shmaddr填0的話則系統(tǒng)自動(dòng)去選擇系統(tǒng)一塊空閑內(nèi)存與共享內(nèi)存關(guān)聯(lián)起來。非0表示使用指定的內(nèi)存地址,容易引起沖突返回值是這塊內(nèi)存的起始地址,注意保存Linux程序的常見概念程序的常見概念(五五)不需要再使用時(shí),shmdt將其引用計(jì)數(shù)釋放掉原型:int shmdt ( char *shmaddr )即使釋放到0,該內(nèi)存也不會(huì)釋放,除非使用shmctl將其標(biāo)
14、志為可移除int shmctl( int shmqid, int cmd, struct shmid_ds *buf )cmd為IPC_RMID,表示標(biāo)志其為可移除Linux程序的常見概念程序的常見概念(五五)#define MY_KEY 55555#define MY_SIZE 2048/* Process 1 */shmid = shmget(MY_KEY, MY_SIZE, IPC_CREATE);char * p = (char *)shmat(shmid, 0, 0)/* 此時(shí)p指向該共享內(nèi)存的起始地址,通過信號(hào)量或鎖,占住該資源后,即可往該內(nèi)存里讀、寫 */.shmdt(p);/*
15、 釋放信號(hào)量或鎖 */Linux程序的常見概念程序的常見概念(五五)/* Process 2 */shmid = shmget(MY_KEY, MY_SIZE, IPC_CREATE);char * p = (char *)shmat(shmid, 0, 0)/* 此時(shí)p也指向該共享內(nèi)存的起始地址,同樣地,通過信號(hào)量或鎖,占住該資源后,即可往該內(nèi)存里讀、寫 */.shmdt(p);/* 釋放信號(hào)量或鎖 */兩個(gè)進(jìn)程經(jīng)過shmat、shmdt后,該內(nèi)存的引用計(jì)數(shù)顯然是0,但該內(nèi)存仍然不會(huì)被釋放。但進(jìn)程1、2任意一個(gè)調(diào)用shmctl(shmid, IPC_RMID, &buf)后,該內(nèi)存就
16、會(huì)被釋放,其中buf對(duì)于IPC_RMID總被忽略小結(jié)和展望小結(jié)和展望多學(xué)習(xí),多看源碼.其實(shí)餓也不懂Make Linux下編譯工程的好幫手,能夠根據(jù)時(shí)間戳檢測(cè)到哪些.c文件需要重新編譯,鏈接 target . : prerequisites .command. 其中target、prerequisites可以是一個(gè)或多個(gè)file,都支持通配符,比如%.c表示以.c結(jié)束的文件名Make command前必須有一個(gè)t,否則的話,Make會(huì)報(bào)錯(cuò);同時(shí)command必須是shell命令 target、prerequisites、command都支持變量 Make還支持include,跟C語言類似;如果i
17、nclude的文件是一個(gè)target,那么target被更新后,這個(gè)文件還會(huì)被重新include進(jìn)來Make Make支持變量,除在command外可以任意定義,用$(variable)即可得到變量值 內(nèi)建的函數(shù),比如wildcard,patsubst等等 還支持shell函數(shù),調(diào)用shell命令,將其結(jié)果賦給變量,相當(dāng)于平時(shí)在shell運(yùn)行命令,得到的結(jié)果由輸出到屏幕變?yōu)橘x值給變量Make gcc的-M命令,可以知道該.c文件依賴于哪些.h文件 這些頭文件包括標(biāo)準(zhǔn)的頭文件及用戶自定義的頭文件 如果編寫的是用戶態(tài)程序,可以使用-MM命令來得到依賴于哪些用戶自定義的頭文件Make 對(duì)于特殊后綴名
18、的文件,Make有其內(nèi)建的目標(biāo)依賴規(guī)則 比如.o文件 %.o : %.c$(CC) -c $(CFLAGS) $ -o $ 我們可以添加自己的目標(biāo)依賴規(guī)則 %.d : %.ccommandMake Cavium上的makefile,與我們以前ARX9上的makefile大相徑庭,不需要告訴make,這個(gè).c文件依賴于哪個(gè).h文件,也不需要告訴如何編譯這個(gè).c文件 這就是Make的魅力Make Cavium上自動(dòng)編譯的Make簡(jiǎn)化版: obj-y += -include $(obj-y:.c=.d) .PHONY: all all: ; %.d: %.c-rm $(CC) -M $(CPPFLAGS) $ $.$sed s,($*).o :*,1.o $ : ,g $-rm $.$Make 通過obj-y,得到需要編譯的所有.c文件,在Cavium上是分散在kernel各子目錄下的Makefile文件中 -include $(obj-y:.c=.d)首先把各個(gè)文件的后綴由.c變成.d,再include進(jìn)來;前面加-,表示即使文件不存在,也不報(bào)錯(cuò)退出 .PHONY: all all: ; 擺設(shè)而已,Make總需要一個(gè)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《民族樂器獨(dú)奏欣賞:音樂鑒賞教學(xué)教案》
- 未來的發(fā)明300字(10篇)
- 2025-2030中國(guó)大輸液行業(yè)經(jīng)營(yíng)現(xiàn)狀分析與前景競(jìng)爭(zhēng)格局展望研究報(bào)告
- 多媒體教學(xué)環(huán)境下教師信息技術(shù)提升計(jì)劃
- 基于逆向教學(xué)設(shè)計(jì)理論的高中數(shù)學(xué)大單元教學(xué)研究
- 關(guān)于故宮的作文題目9篇
- 南郭先生后傳650字11篇范文
- 個(gè)人銀行卡掛失證明書模板
- 網(wǎng)絡(luò)安全知識(shí)普及班會(huì)簡(jiǎn)報(bào)
- 一年級(jí)童話寓言作文標(biāo)點(diǎn)符號(hào)大爭(zhēng)論200字(9篇)
- GB/T 7159-1987電氣技術(shù)中的文字符號(hào)制訂通則
- GB/T 3934-2003普通螺紋量規(guī)技術(shù)條件
- 尿動(dòng)力學(xué)檢查操作指南2023版
- 行政事業(yè)單位無形資產(chǎn)管理辦法模板
- 2023年上海高考語文試卷+答案
- 建筑施工企業(yè)安全生產(chǎn)條件檢查表
- 煤化工工藝學(xué)教材課件匯總完整版ppt全套課件最全教學(xué)教程整本書電子教案全書教案課件合集
- 銀行全國(guó)科技周活動(dòng)宣傳總結(jié)
- SCL-90量表詳細(xì)
- 公路工程項(xiàng)目環(huán)境保護(hù)措施及其可行性論證
- 普通車床的主軸箱設(shè)計(jì)機(jī)械外文文獻(xiàn)翻譯、中英文翻譯、外文翻譯
評(píng)論
0/150
提交評(píng)論