freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

基于arm的gps定位信息顯示器的軟件設計(編輯修改稿)

2025-07-19 03:34 本頁面
 

【文章內容簡介】 整MAM時序使其匹配處理器操作頻率,在本設置所使用的處理器時鐘較快,把MAMTIM配置為3,即使用3個處理器時鐘訪問外部FLASH。經(jīng)過了初始化中斷向量表、配置外部總線、初始化各模式堆棧、設置系統(tǒng)各部分時鐘、設置存儲加速模塊ARM后,ARM將進入用戶主程序,執(zhí)行用戶代碼。 移殖μCOSⅡ到LPC2292嵌入實時操作系統(tǒng)μCOSⅡ是一種占先式多任務操作系統(tǒng)??晒袒?、可裁減、移植性好,具有良好的可靠性和穩(wěn)定性。它支持64個任務,具有信號量、消息郵箱、消息隊列等多種任務間通信機制,Ⅱ的結構以及它與硬件的關系。Applition SoftWareμCOSⅡ(Processer Indentent Code) μCOSⅡ Configuration(Apptication Sepcific)μCOSⅡ Port (Processer Specific Code) 、CPUTimerSoftWareHardWareHardWare C/OSⅡ的結構以及它與硬件的關系。移植μCOSII到一個新的體系機構上一般需要3個文件:(C語言頭文件)、(C程序源文件)(匯編程序源文件)。,;。實際上。 μCOSII中要移植的部分移殖內容類型所屬文件描述BOOLEAN、INT8U INT8S、INT16U INT16S、INT32U INT32S 、FP32 、FP64數(shù)據(jù)類型與編譯器無關的數(shù)據(jù)類型OS_STK數(shù)據(jù)類型堆棧數(shù)據(jù)類型OS_ENTER_CRITICAL()、OS_EXIT_CRITICAL()宏開關中斷的代碼OS_STK_GROWTH常量定義堆棧增長方向OS_TASK_SW函數(shù)任務切換時執(zhí)行的代碼OSTaskStkInit函數(shù)任務堆棧初始化函數(shù)OSTaskStkInit()OSTaskCreateHook()OSTaskDelHook()OSTaskSwHook()OSTaskStatHook()OSTimeTickHook()OSTimeIdleHook()函數(shù)μCOSII在執(zhí)行某些操作調用的用戶函數(shù),一般為空OSStartHighRdy()函數(shù)進入多任務環(huán)境時運行優(yōu)先級最高的任務OSIntCtxSw()函數(shù)中斷級的任務切換函數(shù)OSTickISR()中斷服務函數(shù)時鐘節(jié)拍中斷服務程序,、。 編譯器的慣例。實際上,還有一個文件很重要,,它定義了一個匯編宏,是μCOSII為ARM7通用的中斷服務程序的匯編與函數(shù)接口代碼。時鐘節(jié)拍中斷服務程序也沒有移植,因為其與芯片和應用都強烈相關,需要用戶自己編寫。 (1)數(shù)據(jù)類型定義 數(shù)據(jù)類型的修改與所使用的編譯器相關,不同的編譯器使用不同的字節(jié)長度表示同一數(shù)據(jù)類型。根據(jù)ADS編譯器的要求,這些代碼定義如下: typedef unsigned char BOOLEAN。 /* 布爾變量 */typedef unsigned char INT8U。 /* 無符號8位整型變量 */typedef signed char INT8S。 /* 有符號8位整型變量 */typedef unsigned short INT16U。 /* 無符號16位整型變量 */typedef signed short INT16S。 /* 有符號16位整型變量 */typedef unsigned int INT32U。 /* 無符號32位整型變量 */typedef signed int INT32S。 /* 有符號32位整型變量 */typedef float FP32。 /* 單精度浮點數(shù)(32位長度)*/typedef double FP64。 /* 雙精度浮點數(shù)(64位長度)*/typedef INT32U OS_STK。 /* 堆棧是32位寬度 */  (2)使用軟件中斷SWI作底層接口 為了使底層接口函數(shù)與處理器狀態(tài)無關,同時在任務調用相應的函數(shù)不需要知道函數(shù)的位置,本移植使用軟件中斷指令SWI作為底層接口,使用不同的功能號區(qū)分不同的函數(shù)。 軟中斷功能號功能號接口函數(shù) 簡介0x00void OS_TASK_SW(void)。任務級任務切換函數(shù)0x01void _OSStartHighRdy(void)。運行優(yōu)先級最高的任務0x02void OS_ENTER_CRITICAL(void)關中斷0x03void OS_EXIT_CRITICAL(void)。開中斷0x80void ChangeToSYSMode(void)。任務切換到系統(tǒng)模式0x81void ChangeToUSRMode(void)。 任務切換到用戶模式 0x82void TaskIsARM(INT8U prio)。 任務代碼是ARM代碼 0x83void TaskIsTHUMB(INT8U prio)。 任務代碼是THUMB代碼 底層接口函數(shù)聲明如下:__swi(0x00) void OS_TASK_SW(void)。 __swi(0x01) void _OSStartHighRdy(void)。 __swi(0x02) void OS_ENTER_CRITICAL(void)。 __swi(0x03) void OS_EXIT_CRITICAL(void)。 __swi(0x80) void ChangeToSYSMode(void)。 __swi(0x81) void ChangeToUSRMode(void)。 __swi(0x82) void TaskIsARM(INT8U prio)。 __swi(0x83) void TaskIsTHUMB(INT8U prio)。 用軟件中斷作為操作系統(tǒng)的底層接口就需要在C語言中使用SWI指令。在ADS中,有一個關鍵字__swi,用它聲明一個不存在的函數(shù),調用這個函數(shù)就在調用這個函數(shù)的地方插入一條SWI指令,并且可以指定功能號。(3) 定義堆棧增長方向 雖然ARM處理器可以支持堆棧向上增長,也可以支持堆棧向下增長,但是ADS的C語言編譯器僅支持一種方式,即從上往下增長。所以定義如下: define OS_STK_GROWTH 1 (1) OSTaskStkInit() OSTaskCreate()和OSTaskCreateExt()通過調用OSTaskStkInt()來初始化任務的堆棧結構。(2) 軟件中斷異常SWI服務程序C語言部分函數(shù)原型為void SWI_Exception(int SWI_Num,int *regs)。參數(shù)SWI_Num為功能號,而Regs為指向堆棧中保存寄存器的值的位置。程序通過一個switch語句把各個功能分割開,各個功能相對獨立。(3) OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()μCOSII使用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()分別關中斷和開中斷。在ARM處理器核中關中斷和開中斷時,通過改變程序狀態(tài)寄存器CPSR中的相應位來實現(xiàn)。由于使用了軟件中斷,程序狀態(tài)寄存器CPSR保存到程序狀態(tài)保存寄存器SPSR中,軟件中斷退出時會將SPSR恢復到CPSR中,所以程序只要改變程序狀態(tài)保存寄存器SPSR中的相應的控制位就可以了。 (1) SoftwareInterrupt()這是軟件中斷的匯編接口,當發(fā)生軟件中斷時,程序通過異常向量表跳轉到軟中斷的匯編與C接口程序SoftwareInterrupt處。軟件中斷代碼如下:LDR SP, StackSvc 。 重新設置堆棧指針STMFD SP!, {R0R3, R12, LR}MOV R1, SP 。 R1指向參數(shù)存儲位置MRS R3, SPSRTST R3, T_bit 。 中斷前是否是Thumb狀態(tài)LDRNEH R0, [LR,2] 。 是: 取得Thumb狀態(tài)SWI號BICNE R0, R0, 0xff00LDREQ R0, [LR,4] 。 否: 取得arm狀態(tài)SWI號BICEQ R0, R0, 0xFF000000。 r0 = SWI號,R1指向參數(shù)存儲位置CMP R0, 1LDRLO PC, =OSIntCtxSwLDREQ PC, =__OSStartHighRdy 。 SWI 0x01為第一次任務切換 BL SWI_ExceptionLDMFD SP!, {R0R3, R12, PC}^StackSvc DCD (SvcStackSpace + SVC_STACK_LEGTH * 4 4)因為執(zhí)行任務切換時堆棧指針會指向用戶的堆棧,這樣下一次進入管理模式就會破壞用戶堆棧,從而導致程序執(zhí)行不正確。所以程序在一開始設置堆棧指針。軟中斷指令使處理器進入管理模式,而用戶程序處于系統(tǒng)/用戶模式,其它異常也有自己的處理器模式,都有各自的堆棧指針,不會因為給堆棧指針賦值而破壞其它處理器模式的堆棧而影響其它程序的執(zhí)行。返回的地址已經(jīng)存儲在連接寄存器LR中而不是存儲在堆棧中。由于進入管理模式自動關中斷,所以這段程序不會被其它程序同時調用,設置的堆棧指針指向的位置肯定是空閑位置,后一次調用不會影響前一次調用。這樣就可以保證“LDR SP, StackSvc”進行正確的堆棧指針設置。(2) OSCtxSw()任務級的任務切換函數(shù),當任務被阻塞而主動請求CPU調度時被執(zhí)行,由于此時的任務切換在非異常模式下進行,因此有別于中斷級別的任務切換。它的工作是先將當前的任務的CPU現(xiàn)場保存到該任務堆棧中。然后獲得最高優(yōu)先級任務的堆棧指針,從該堆棧中恢復此任務的CPU現(xiàn)場,使之繼續(xù)執(zhí)行。這樣就完成一次任務的切換。(3) OSIntCtxSw()中斷級的任務切換,在時鐘中斷ISR中發(fā)現(xiàn)有高優(yōu)先級任務等待時鐘信號的到來,則在中斷退出后并不是返回被中斷的任務,而是直接調度就緒的高優(yōu)先級任務執(zhí)行(函數(shù)OSIntExit()被用來在ISR使得更高優(yōu)先級的任務處于就緒態(tài))。從而能夠盡快讓高優(yōu)先級的任務得到響應,保證系統(tǒng)的實時性能。其基本原理與任務的切換相同。但是由于進入中斷時已經(jīng)保存了被中斷的CPU現(xiàn)場,因此不用做類似的操作,只需對堆棧指針做相應調整。(4) OSStartHighRdy()μC/OSⅡ啟動多任務環(huán)境的函數(shù)叫做OSStart()。用戶在調用OSStart()之前,必須已經(jīng)建立了一個或更多任務。OSStart()最終調用OSStartHighRdy()函數(shù)運行多任務啟動前優(yōu)先級最高的任務。由軟中斷的匯編接口SWI_Exception()與C接口程序SoftwareInterrupt()可知,這是調用軟中斷的1號功能。這是因為ARM處理器核具有兩個指令集,在執(zhí)行Thumb指令的狀態(tài)時不是所有寄存器都可見,而且任務可能不在特權模式。為了兼容任意一種模式,本移植使用軟中斷指令SWI使處理器進入管理模式和ARM指令狀態(tài),并使用功能1實現(xiàn)OSStartHighRdy的功能。μC/OSⅡ中調用函數(shù)OSStartHighRdy()之前,OSTCBHighRdy指向的是優(yōu)先級最高的任務的任務控制塊。__OSStartHighRdy代碼如下: MSR CPSR_c, (NoInt | SYS32Mode) LDR R4, =OSRunning MOV R5, 1 STRB R5, [R4] BL OSTaskSwHook LDR R6, =OSTCBHighRdy LDR R6, [R6] B OSIntCtxSw_1在μC/OSⅡ中,需要用戶提供周期性信號源,用于實現(xiàn)時間延時和確認超時。必須在多任務系統(tǒng)啟動以后再開啟時鐘節(jié)拍器,也就是在調用OSStart()之后。換句話說,在調用OSStart()之后做的第一件事是初始化定時器中斷。通常,容易犯的錯誤是將允許時鐘節(jié)拍器中斷放在系統(tǒng)初始化函數(shù)OSInit()之后,在調用啟動多任務系統(tǒng)啟動函數(shù)OSStart()之前允許時鐘節(jié)拍中斷。μC/OSⅡ的啟動多任務函數(shù)OSStart()會在最后調用OSStartHighRdy,而SStartHighRdy的第一條語句MSR CPSR_c,(NoInt|SYS32Mode),是將CPSR的第8位置1,允許IRQ中斷。 中斷及時鐘節(jié)拍(1) 中斷句柄HANDLER中斷句柄HANDLER可以容易的聲明中斷處理函數(shù), Uart0_Handler HANDLER UART0_IR
點擊復制文檔內容
語文相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1