cortex-m3 是一款非常強大的單片機,和arm A系列(應(yīng)用處理器)的確有很大的區(qū)別
但是還是很多相似之處,畢竟都是arm的東西
下面是閱讀CM3權(quán)威指南的一些摘要:
1. P25 兩個級別(user,svc),2個運行模式(handler,thread),3種組合(user沒有handler mode) handler ,thread 的區(qū)別可能就是(4)中的自動壓棧
特權(quán) | 用戶 ——————————————————————— 異常(exp,irq)處理 handler | 錯誤 ——————————————————————— 主應(yīng)用的代碼 線程 | 用戶
注意mode 切換圖 [特權(quán)handler mode] / ^ \ ^ / / \ \ / / (異常返回) (觸發(fā)異常) (異常返回) (觸發(fā)異常) \ \ / / \ \________________ / / \_____________ | / / | | V / V | 復(fù)位---> [特權(quán)級thread mode]----(修改CONTROL REG)--->(用戶級thread mode) CM3: handler mode (注意總是 MSP!) thread mode, 可以使用 MSP thread mode, 也可以使用PSP,通過control reg 設(shè)置 注意和ARM9 ARM A系統(tǒng)等比較 它們在各異常(Abort,Undefine,IRQ,FIQ),User,Supervisor 都有自己的SP(R13) 移值時注意這個巨大差異!!!
2. P27 內(nèi)存的分布
3. P30 異常名稱介紹,[-1]----[-3] 3個固定優(yōu)先級,NMI[-2] 的作用不錯 P43 11-SVCCall, 15-SysTick 可以關(guān)注下
4. P32 進(jìn)入異常服務(wù)例程,自動壓棧 R0-R3,R12,LR(R14),PSR,PC(R15)
5. P36 棧指針分MSP(SP_main), PSP(SP_process) ,push,pop 指令根據(jù)CONTROL[1](P40],自動判斷當(dāng)前那個SP 如果有特殊要求可以通過MRS/MSR 來指定訪問
6. P38 注意讀PC 時,當(dāng)前支流+4 ,和 arm9上 (PC+8)有區(qū)別, pc 奇數(shù)這句表示必須在thumb2 下
7. P39 特殊功能寄存器 MRS/MSR 讀/寫 PSR 分: APSR 應(yīng)用程序PSR (N,Z,C,V,Q)[31-27] IPSR 中斷號PSR (Exception Number) [8-0] (如果是thread,那么值為0,因為沒有0號異常) EPSR 執(zhí)行PSR (ICI/IT)[26:25] ,(T)[34],(ICI/IT)[15:10]
8. P39. 異常(中斷) 控制register PRIMASK 開關(guān)中斷 FAULTMASK 開關(guān)異常 BASEPRI 優(yōu)先級
9. P40 快速開關(guān)中斷異常 CPSID I ;PRIMASK=1 關(guān) CPSIE I ; =0 開
CPSID F ;FAULTMASK 關(guān) CPSIE F
10. P40 CONTROL register CONTROL[1] 0---MSP (reset default) (handler mode 必須為0) CONTROL[1] 1---PSP
CONTROL[0] 1---svc mode CONTROL[0] 0---user mode
11. P41 復(fù)位后為 thread mode + svc mode thread mode + svc mode 對系統(tǒng)空間阻止訪問,MRS/MSR 也禁用,否則fault 注意user ,svc mode 的切換 (control[0] + user 發(fā)生異常(+SVCall)
12. P43 異常相量表 P109 ,16 個異常,240 IRQ
13. P46 使用滿遞減棧,雙棧(svc,user),用于帶kernel的 user ,kernel 切換很好
14. P47 奇特的復(fù)位過程,可以看下 1. 從0x0地址取MSP 2. 從0x4地址取PC的值,這個值是復(fù)位向量,LSB 必須為1,然后從這個地址所 對應(yīng)的地址處取值 [reset] -->[0x0(MSP)][0x4(復(fù)位向量)]----->[Reset Vector] ! (0x0--開始是MSP,然后接下拉是向量表!!!) (向量表中都是32bit 地址,比如0x4放的就是reset 執(zhí)行指令位置) P148 圖3.18
15. P50 指令后綴使用: S 更新APSR中標(biāo)志 EQ,NE,LT,GT 等等 等只有B(跳轉(zhuǎn))指令才能任意用,其他指令引入IF-THEN 塊,在這個塊中才可以加后綴
16. P51 注意thumb 語法和thumb 2 以及arm 的區(qū)別 ,在UAL 下thumb2 和arm 基本相似 但也可以用thumb 語法明確 16bit 指令 或者通過 .N(16bit) .W(32bit) 來指定 16bit ,32bit
17. P59 自增自減,根據(jù)指令寬度, LDMIA Rd! ,{register list} 讀后Rd 自增16bit LDMIA.W RD! ,{register list} 讀后Rd 自增32bit
18. P69 BX reg, 指令中reg 中最低位必須為1 (LSB=1) ,因為CM3 只在Thumb 中允許,否則fault 而BLX reg arm ,thumb 都支持,根據(jù)LSB=1 thumb LSB=0 arm
19. P71 大多數(shù)16bit 算術(shù)邏輯指令,直接更新標(biāo)志位 ,除 ADD.N Rd,Rn,Rm 32bit 需要S 后綴來控制
20. P72 barrier 指令 DMB --- 數(shù)據(jù)訪問指令等前面數(shù)據(jù)訪問指令完成才執(zhí)行 DSB --- 任何指令等前面數(shù)據(jù)訪問指令完成才執(zhí)行 (比如建立完所有向量后追加1條DSB P168) ISB --- 任何指令等前面指令完成才執(zhí)行 依次往下表現(xiàn)barrier 更嚴(yán)格
21. P73 帶符號 飽和運算指令 SSAT.W Rd #imm5,Rn,{,shift} 不帶符號飽和運算指令
22. P75 MRS/MSR 除APSR 可以在user級訪問,其他必須特權(quán)級
23. P76 IF-THEN(IT)里最多有4條支流 IT <cond> ; 圍起1條 IT<x> <cond> ; 圍起2條 IT<x><y> <cond> ; 圍起3條 IT<x><y><z> <cond> ; 圍起4條 <x><y><z> =>為 T(then),E(else) IT指令的意義: 當(dāng)執(zhí)行到跳轉(zhuǎn)指令時,需要清洗流水線,處理器必須從跳轉(zhuǎn)地址重新取指, IT可以改善一些小跳轉(zhuǎn)!!!
24. P76 比較跳轉(zhuǎn)CBZ <Rn> , <lable> CBNZ <Rn> , <lable> ,但范圍很小只有0-126 并且不會更新標(biāo)志位
25. P80 跳轉(zhuǎn)表指令TBB ,TBH
26. P84 CM3 存儲映射 0x0-------------------------------------------------------------------------4G |512M(代碼)|512M(片上SRAM)|512M(片上設(shè)備)|512M(片外SRAM)|512M(片外設(shè)備)|512M| / | ---------------------------------- | |內(nèi)部私有外設(shè)總線|外部私有外設(shè)總線|其他| 0xE0000000 0xE0040000 0xE0100000
27. P85 CM3 存儲器訪問屬性 Bufferable, Cacheable,Executable,Sharable
28. P88 位帶操作, 0bit --- 0x0(位帶別名區(qū)偏移) 1bit ---- 0x4 操作 位帶區(qū) bit2 無別名 使用別名 LDR R0,=0x20000000 LDR R0,=0x22000008 LDR R1,[R0] MOV R1,#1 ORR.W R1, #0x4 STR R1,[R0] STR R1,[R0] 注意位帶別名地址必須對齊到字, 位帶別名操作原子的
29. P94 對齊的地址傳輸: LDR/STR, LDM/STM, PUSH/POP, LDREX/STREX,位帶別名操作
30. P96 LDREX/STREX 實現(xiàn)mutex 的原理 LDREX后,處理器會在內(nèi)部標(biāo)記出一段地址(范圍可定義),后續(xù)執(zhí)行到STR/STREX, 只要其存儲地址落在標(biāo)記范圍內(nèi),就會清除此標(biāo)記, 下一個STREX 執(zhí)行先檢查有沒有做過標(biāo)記和范圍,否則駁回STREX
31. P113 子優(yōu)先級至少1bit,所以搶占優(yōu)先級最多7bit,這就造成了128級搶占情況 P112 AIRCR(中斷及復(fù)位控制寄存器) 0xE000_ED00 其中[10:8]PRIGROUP 設(shè)置優(yōu)先分組 比如寫5,表示從第5bit 處分,前面2bit表示搶占優(yōu)先級(P171) 一般3級: 3bit =>0x00,0x20,0x40,0x60,0x80,0xA0,0xC0,0xE0 這8個值有效
32. P116 向量表偏移寄存器(VTOR:0xE000_ED08) 向量數(shù)對齊到2的整次冪,比如 32irq+16except=48 =>64 個 然后64*4 =256,那么按0x100 對起的偏移量 (P170 向量表移動的sample!)
33. P117 當(dāng)某中斷的服務(wù)例程開始執(zhí)行時,就稱此中斷進(jìn)入了active 狀態(tài),并且其懸起位 會被硬件自動清除 ,一般ISR 執(zhí)行完成,才能對新請求響應(yīng),所以軟件在ISR中 清除中斷請求
34. P121 總線fault 狀態(tài)寄存器(BFSR) 0xE000ED29
35. P122 MemManage fault 的原因: NVIC 中寄存器: MFSR(指出導(dǎo)致MemManage fault 的原因) DACCVIOL bit --- 數(shù)據(jù)訪問違例 DACCVIOL bit --- 取指訪問違例 MMAR---可讀出引發(fā)此fault 的地址 在不帶mmu 的操作系統(tǒng)中,這個東西具體發(fā)揮什么先進(jìn)功能???
36. P122 用法fault必須被使能才能正常響應(yīng),使能位是NVIC的系統(tǒng)handler控制及狀態(tài)register 的USGFAULTENA, 總線fault 和 MemManage fault 則不需要enable 用法fault 的原因可以查 UFSR(用法fault狀態(tài)寄存器) 0xE000_ED2A
37. P124 硬fault狀態(tài)寄存器 0xE000_ED2C 發(fā)生的三種情況: 調(diào)試, 其他fault 上訪,取向量(異常處理時對向量表讀取)
注意各fault服務(wù)例程在處理后要清FSRs狀態(tài)寄存器
38. P125 如果分kernel user,那么user svc 進(jìn)入kernel,如果user 使用PSP ,那么 kernel 訪問PSP (MRS Rn,PSP) 找到user 的棧指針,然后分析LR
39. P127 關(guān)于PSVC的應(yīng)用!!! OS在某中斷活躍時嘗試切入,線程模式,將觸發(fā)use fault
40. P129 除軟件中斷寄存器外,所有中斷控制及狀態(tài)寄存器只能在特權(quán)級下訪問
41. P130 enable disable 中斷:(寫1有效) SETENA0---SETENA7 0xE000_E100---E11C CLRENA0-7 0xE000_E180---E19C 可以參考P168的sample! (REG addr offset = (N/32)*4)
42. P131 中斷pending : SETPEND0-7 (寫1懸起) 0xE000_E200---E21C CLRPEND0-7 (寫1解懸) 0xE000_E280---E29C
43. P131 中斷優(yōu)先級寄存器 (8bit可分為高底兩段,分別為搶占優(yōu)先級和亞優(yōu)先級) PRI_0---239 (每個8bit)(0xE000_E400-E4EF) 及系統(tǒng)異常優(yōu)先級寄存器(0xE000_ED18-ED23)
44. P132 中斷活動狀態(tài) 只讀,處理器執(zhí)行了ISR第1條指令后set1, 直到ISR返回時才硬件清0 ACTIVE0---7 (0xE000_E300---E31C)
45. P133 PRIMASK disable NMI,硬fault 之外所有異常(將當(dāng)前優(yōu)先級改為0) 關(guān)中斷 MOV R0,#1 MSR PRIMASK,R0 或者 CPSID i
開中斷 MOV R0,#0 MSR PRIMASK,R0 或者 CPSIE i
FAULTMASK 連硬fault 也disable (將當(dāng)前優(yōu)先級改為-1) 但注意異常退出時自動清0!
BASEPRI 寄存器 用于mask 低于某優(yōu)先級的中斷 BASEPRI_MAX 只能越設(shè)越高(只能擴大mask 范圍) 用戶態(tài)不能訪問BASEPRI 根據(jù)優(yōu)先級位數(shù)判斷mask值是否有效 3bit =>0x00,0x20,0x40,0x60,0x80,0xA0,0xC0,0xE0 這8個值有效 通過動態(tài)計算的方法在P167
46. P134 系統(tǒng)handler控制及狀態(tài)寄存器SHCSR(0xE000_ED24) 使用這部分寄存器請小心 一般在: 系統(tǒng)調(diào)用過程中執(zhí)行上下文切換 使用軟件模擬為定義指令功能
47. P135 中斷控制及狀態(tài)寄存器ICSR (0xE000_ED04) VCETPENDING 懸起的最高優(yōu)先級的ISR的編號 RETTOBAE ??? VECTACTIVE 當(dāng)前活動的ISR編號 P137 中斷系統(tǒng)設(shè)置過程示例
48. P137 軟件觸發(fā)中斷寄存器STIR(0xE000_EF00) 寫入8,則懸起IRQ #8 (P170) 軟件中斷的使用說明 (P137通過軟件觸發(fā)某 IRQ n) 1. 設(shè)置NVIC USERSETMPEND位 2. 寫0xE000EF000后必須執(zhí)行DSB(數(shù)據(jù)同步隔離) 3. 該IRQ n必須使能 4. 如果只是為了系統(tǒng)調(diào)用盡量用SVC 指令
49. P138 SysTick 控制及狀態(tài)寄存器(0xE000_E010) SysTick reload寄存器(0xE000_E014) SysTick 當(dāng)前數(shù)值寄存器(0xE000_E010) SysTick 校準(zhǔn)數(shù)值寄存器(0xE000_E010) 注意當(dāng)處理器在調(diào)試時被halt,SytTick也暫停運行!
50. P141 響應(yīng)異常的3個動作(!!!): 1.入棧 xPSR,PC,LR,R12,R3-R0 當(dāng)前上PSP 就壓PSP,否則壓MSP,進(jìn)入服務(wù)例程一直使用MSP P142 如果棧有雙字對齊,如果不對齊,先空4字節(jié),然后壓棧
2.取向量 3.更新寄存器
51. P143 異常返回(!!!)及指令 BX LR (EXC_RETURN) POP {...,PC} LDR/LDM =>PC
1.出棧, 2.更新NVIC (同級異常不可重入)
52. P144 咬尾中斷(硬件處理) 當(dāng)處理器響應(yīng)異常時,有發(fā)生異常,前次異常push的,仍舊對下次異常有效 P145 晚到中斷的方式基本同上, 省去一個pop,push
53. P147 異常返回值 LR= 0xFFFF_FFF1 返回handler mode (注意總是MSP!) 0xFFFF_FFF9 返回thread mode,并使用MSP 0xFFFF_FFFD 返回thread mode,并使用PSP 正真的LR ,已經(jīng)在主程被打斷前自動入棧了,(LR=>EXC_RETURN,只是指出在那個SP!!!) 0xFFFF_FFF1所指主程其實就是被搶占的服務(wù)例程
54. P148 質(zhì)量LDM/STM 的中止和繼續(xù)(xPSR開出若干ICI 位)
55. P148 異常響應(yīng)時的faults 1.入棧 => 總線fault BFSR bit4 STKERR 存儲fault MFSR bit4 MSTKERR
2.出棧 => 總線fault BFSR bit3 UNSTKERR 存儲fault MFSR bit3 UNMSTKERR 3.取向量 => 硬fault HFSR bit VECTTBL
4. 無效返回 =>use fault => UFSR bit2 INVPC ,bit1 INVSTATE (if disabled then hard fault)
56. P152. 在使用C開發(fā)時建議開啟CM3的雙字對齊 #define NVIC_CCR ((volatile unsigned long *)(0xE000ED14)) *NVIC_CCR = *NVIC_CCR |0x200; //set STKALIGN
57. P155 一個串口輸出程序 P160 使用mutex 實現(xiàn)信號量訪問 LDREX R2,[R1] ... STREX R2,R0, [R1] CMP R2,#0 => R2 == 0 那么就表示成功 P161 使用位帶實現(xiàn)互斥鎖操作 (P88=> 位帶別名操作原子的) P163 使用位段提取與查表跳轉(zhuǎn)
58. P165 主堆棧安全容量計算方法 每個中斷都可以嵌套,對于每1級至少需要8字(32字節(jié)),附加考慮ISR局部變量的大小量 進(jìn)程堆棧處了滿足本進(jìn)程所有函數(shù)調(diào)用的最大需求量外,好要保留8字,用于容納第1級 中斷時被保護的寄存器(然后進(jìn)入主棧)
59. P167 RBIT R2,R1, 反轉(zhuǎn)R1,并LSB對齊 R1=0xE0 =>R2=0x07 (P55表) CLZ R1,R2 計算前導(dǎo)0個數(shù) R1=0x07 =>R2=0x5
60. P169 一個ISR 匯編的主結(jié)構(gòu) (注意R4-R11要自己保護, 其他8個自動保護P141) PUSH {R4-R11,LR} ... POP {R4-R11,PC} 浪費了1字LR再壓棧1次 PUSH {R4-R11} ... POP {R4-R11},BX LR 更節(jié)約
61. P171 一個比較完整的中斷處理例程 其中SetupIrqHandler 負(fù)責(zé)建立向量表中斷服務(wù)例程入口地址,所以向量表 必須移動到RAM中,否則無法動態(tài)設(shè)置!!!
62. P173 SVC使用: 1.SVC 提供1個8位立即數(shù) 2.SVC框架: svc_handler TST LR, #4 ;測試EXC_RETURN的bit2 ITE EQ ; 如果為0,下面包括2條指令 (P76) MRSEQ R0,MSP ; 如果==0 則使用MSP MRSNE R0,PSP ; 否則使用PSP LDR R1,[R0,#24] ;從棧中讀取PC值 (+24見P142表9.1) ;注意自動壓棧8個reg, ;總是8字對齊的所以不用考慮 LDRB R0,[R1,#-2] ;從立既數(shù)取系統(tǒng)調(diào)用號 ; P54表4.5 SVC 是16bit 指令 ;準(zhǔn)備系統(tǒng)調(diào)用func,這需要適當(dāng)調(diào)整入棧的PC及LR(EXC_RETRUN), 來進(jìn)入OS內(nèi)部 BX LR ;借異常返回形式,進(jìn)入OS 內(nèi)部,call sysfunc ;可使用TBB/TBH查表跳轉(zhuǎn)加速 ;返回user的情況如何處理 ???
63. P173 一個具體的SVC 例程 (也可以放在Rx,linuxEABI-R7) 但注意咬尾+晚到情況(P176)!!! P178 一個gcc 內(nèi)聯(lián)匯編的svc 代碼
64. P180 一個MPU系統(tǒng)的布局 __________________________________________________________ |用戶數(shù)據(jù) | 用戶棧 | 特權(quán)數(shù)據(jù) | 特權(quán)棧 | ---------------------------------------------------------- (user 級訪問) ^ (supervisor級訪問) ^ PSP MSP
65. P180 一個簡單OS的init 和返回user級的過程 (這里叫user級,不叫user空間,因為沒有MMU) 1. OS init 2. 建立PSP,并創(chuàng)建任務(wù)的堆棧(PC,xPSR) 3. 把EXC_RETURN 改為0xFFFFFFFD 返回 (P147)
66. P181 一個使用Systick及PendSV(優(yōu)先級最低異常)來實現(xiàn)輪轉(zhuǎn)調(diào)度和上下文切換的例子 1. user程序#1 ===> 響應(yīng) Systick 異常后進(jìn)入OS 2. OS 執(zhí)行系統(tǒng)管理 3. OS 懸起PendSV以便從systick 異常返回后執(zhí)行調(diào)度和switch context 4. 從systick返回如果無其他異;蛑袛鄤t進(jìn)入 PendSV ,這時通過PSP 保存user#1程序 堆棧幀,再把PSP 指向user#2程序的堆棧幀 修改EXC_RETURN,(#2堆棧幀pop2psp)并且返回
67. P182 非基級thread mode的使用 可以在服務(wù)例程中切換到thread mode,這樣如果中斷服務(wù)例程是用戶程序的1部分 ,可能需要讓它在thread mode 下執(zhí)行,以現(xiàn)在訪問特權(quán)級下的資源 比如: redirect_handler PUSH {LR} SVC #0) ;通過系統(tǒng)服務(wù),由特權(quán)級進(jìn)入user級 (BL User_IRQ_Handler ) (SVC #1 ;執(zhí)行完中斷處理后,回特權(quán)級 POS {PC} ;本次中斷返回 上面帶括號中的指令,包括SVC #0 返回部分,和SVC #1的進(jìn)入部分 ,都是在PSP+thread mode 下運行,理解這部分有助手動調(diào)棧的了解 * 所以第1次調(diào)整PSP,是為了SVC0返回用,否則svc0不知道返回那里 因為SVC0是在PSP上返回,所以將SVC0的MSP上內(nèi)容cpy過來
* 第2次調(diào)整為了SVC1的返回,因為SVC1壓棧在PSP,返回在MSP 所以,先將PSP上+0x18的內(nèi)容讀出(pop pc指令地址),然后 修改MSP上原來SVC0壓入的LR(+0x18),然后PSP東西拋棄 然后Bx LR,返回到SVC1下面那條指令
* 一般情況下異常是在Handler+MSP下,但是通過 1. 對PSP中已經(jīng)壓入的IPSR清0 2. 然后NVIC中配置和控制寄存器CCR的NONBASETHRDENA位設(shè)置 3. 最后修改EXC_RETURN,并BX LR返回,就可以返回到PSP+thread 特殊的一半在handler+MSP一半在thread+PSP 需要手動調(diào)棧具體見P183-184: 主要就是 SVC #0 時特權(quán)級IRQ棧(MSP)上的內(nèi)容到PSP上, 然后進(jìn)入user thread,注意進(jìn)入user thread要清0,IPSR 而這步必須在特權(quán)級下做!!!
68. P185 1. 消滅存儲器等待周期的方法 ??? 2. 中斷向量盡量放代碼區(qū),防止取向量與入棧搶總線 3. 限制非對齊訪問
一些匯編的技巧: 1.使用帶偏移的LDR/STR,可以省去地址增減等計算 2. 上下文相關(guān)的變量放到一起,這樣就可以創(chuàng)造使用LDM/STM 連續(xù)地址的數(shù)據(jù)傳送 3. 當(dāng)遇到很小if then ,可以使用(ITxxx),最多包括4條 4. 盡量使用thumb-2 指令 5. 多用CM3新指令
69. P186 鎖定圖12.5
70. P191 消除systick 異常兩次懸起,通過在異常處理中除能systick,并清除 NVIC的Systick 懸起位(0xE000ED04)
71. P192 系統(tǒng)控制寄存器(0xE000_ED10) bit 4 SEVONPEND bit 2 SLEEPDEEP 當(dāng)進(jìn)入睡眠mode時,使能外部的SLEEPDEEP 信號,以允許停止系統(tǒng)時鐘 bit 1 SLEEPONEXT
圖13.2進(jìn)入睡眠模式的序列 WFI(WaitForInterrupt) WFE(WaitForEvent) | | | | | (清除事件鎖存器) 事件鎖存器!=1 | <-------------------------<------| | 事件鎖存器==1 SLEEPDEEP!=1) | (SLEEPDEEP==1) | |---------------| V | | (清除事件鎖存器) V V (然后執(zhí)行下條指令) 進(jìn)入普通睡眠(idle) 進(jìn)入深度睡眠(suspend) SLEEPING信號為高 SLEEPING和SLEEPDEEP都為高 SLEEPDEEP為低!
72. P193 喚醒小節(jié): P194 SleepOnExit 自動睡眠功能演示
73. P194 多機通信功能 (有機會再看)
74. P202 CM3共支持8個regions,允許把每個region進(jìn)1步劃分為更小的 子region 次外還允許啟用1個背景region(即沒有MPU時的全部地址空間)
75. P204 PRIVDEFENA =1 允許特權(quán)級訪問背景region (圖14.1) 注意有個列外: 不管MPU如何限制,響應(yīng)異常是的取向量操作,以及對系統(tǒng)分區(qū)(E000_xxxx) 的訪問不受影響
76. P205 1. MPURNR (MPU region 號) 0xE000ED98 2. MPURBAR (基地址) 0xE000ED9c [31:N] N >=16 ADDR [4] valid [3:0] 那個region 3. MPURASR (屬性及容量) 0xE000EDA0
當(dāng)region 不夠用,如果是特權(quán)級就放到背景region中 總之這款arm 單片機就其單片機的角色,的確強大,特別是MPU,user級特權(quán)級等概念一看就是跑RTOS的好材料,但是感覺象ucos這樣簡單的RTOS 不是很合適,但比較強大的也不行,比如linux,主要是因為MMU,雖然都有支持linux 的cortex m3的patch ,但沒有了MMU,也沒發(fā)揮出強大os的特性,不過也沒見過那款單片機帶MMU的,所以個人認(rèn)為cortex m3 應(yīng)該有一款自己特定的os ,才能最大發(fā)揮他的特點
|