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

正文內容

基于arm的數據采集系統(tǒng)-資料下載頁

2025-06-22 04:05本頁面
  

【正文】 /* r9 */ *stk = 0。 /* r8 */ *stk = 0。 /* r7 */ *stk = 0。 /* r6 */ *stk = 0。 /* r5 */ *stk = 0。 /* r4 */ *stk = 0。 /* r3 */ *stk = 0。 /* r2 */ *stk = 0。 /* r1 */ *stk = (unsigned int) pdata。 /* r0 */ *stk = (SVC32MODE|0x0)。 /* cpsr IRQ, FIQ disable */ return ((void *)stk)。},根據編譯器手冊具體來修改,堆棧單位應該和CPU寄存器的長度一致,堆棧增長方向定義為向下增長。OSStartHighRdy(),此函數是在OSStart()多任務啟動后,負責從最高優(yōu)先任務的控制塊中獲得堆棧指針SP,然后運行該任務;OSCtxSw()完成任務級的上下文切換,當任務被阻塞時,CPU調用該函數,它的目的是將當前CPU寄存器保存于任務堆棧中,然后獲得最高優(yōu)先級的任務指針,運行該任務;OSIntCtxSw()中斷級的任務切換,與前面敘述的函數功能一樣,只是由于進入中斷時,已經保存了進入中斷任務的CPU現場,因此不再需要保存,只需對堆棧指針作相應調整;OSTickISR()時鐘中斷處理函數,其主要任務是負責處理時鐘中斷,調用OSTimeTick()函數實現時鐘遞減。因為多任務的切換是移植的重點,此處僅以OSCtxSw()為例說明實現的具體過程。代碼如下:IMPORT OSTCBCuraddr_OSTCBCur DCD OSTCBCur IMPORT OSTCBHighRdyaddr_OSTCBHighRdy DCD OSTCBHighRdy IMPORT OSPrioCuraddr_OSPrioCur DCD OSPrioCur IMPORT OSPrioHighRdyaddr_OSPrioHighRdy DCD OSPrioHighRdyOSCtxSw STMFD sp!, {lr} 。 save pc STMFD sp!, {lr} 。 save lr STMFD sp!, {r0r12} 。 save register file and ret address MRS r4, CPSR STMFD sp!, {r4} 。 save current PSR LDR r4, addr_OSTCBCur LDR r5, [r4] STR sp, [r5] 。 store sp in preempted tasks39。s TCB LDR r4, addr_OSPrioCur LDR r5, addr_OSPrioHighRdy LDRB r6, [r5] STRB r6, [r4] LDR r4, addr_OSTCBHighRdy LDR r5, addr_OSTCBCur LDR r4, [r4] STR r4, [r5] LDR sp, [r4] LDMFD sp!, {r4} MSR CPSR_cxsf, r4 LDMFD sp!, {r0r12, lr, pc} 4. 移植uC/OSII后的測試 uC/OSII操作系統(tǒng)移植至此就完成了代碼的編寫。下面開始測試操作系統(tǒng)代碼移植的正確性,建立3個簡單的任務通過串口輸出測試信息。3個任務代碼如下:void Task1(void*id){while(1){puts(AAAAAAA1111111\n)。OSTimeDly(10)。}}void Task2(void*id){while(1){puts(BBBBBBB3333333\n)。OSTimeDly(30)。}}void Task3(void*id){while(1){puts(CCCCCCC6666666\n)。OSTimeDly(60)。}} 上述3個任務的優(yōu)先級由高到低分別是:Task1,Task2,Task3。函數OSTimeDly()為系統(tǒng)的延時函數,用于延時一定數量的時鐘節(jié)拍,本系統(tǒng)中設定的時鐘節(jié)拍為1毫秒。當系統(tǒng)運行這3個任務后。 測試任務的輸出信息界面 ,第一個10ms任務1輸出AAAAAAA1111111,第二個10ms任務1再次輸出AAAAAAA1111111,此時另外兩個任務被掛起。當第三個10ms來臨時,任務2被喚醒,此時任務1和任務2同時處于就緒態(tài),但由于任務1的優(yōu)先級別高于任務2,所以再次輸出AAAAAAA1111111,隨后輸出任務2的BBBBBBB3333333。當第60 ms來臨時,任務1,任務2和任務3同時處于就緒態(tài),但由于任務1優(yōu)先級別高于任務2,任務2優(yōu)先級別高于任務3,所以此時首先輸出AAAAAAA1111111,接著是BBBBBBB3333333,最后是任務3的CCCCCCC6666666。由此可以看出移植的操作系統(tǒng)已經在硬件平臺上正確的運行,uC/OSII在S3C44B0X系統(tǒng)上移植成功。5. 基于uC/OSII的應用程序設計綜合應用程序的實時性和各個功能模塊的協調性,把應用程序劃為了四個任務:“系統(tǒng)”任務,“觸摸屏”任務,“應用程序”任務和“LCD刷新”任務,讓uC/OSII內核去管理和調度它們?!坝|摸屏任務”主要負責采集觸摸屏信號,并根據信號的有效性作出具體響應;“系統(tǒng)任務”擁有最高優(yōu)先級,啟動其他優(yōu)先級別較低的任務,最后刪除自己處于掛起狀態(tài); “LCD刷新任務”主要是不斷刷新液晶屏; “應用程序任務”主要負責執(zhí)行系統(tǒng)的用戶應用程序。每個任務堆棧的大小都統(tǒng)一設為1024字節(jié),初始化代碼如下:void Main(void){OSInit()。OSTaskCreate(Task_System,(void *)0,(OS_STK *)amp。Stack0[STACKSIZE_L1], 1)。OSTaskCreate(Task_Touch,(void *)0, (OS_STK *)amp。Stack1[STACKSIZE_L1], 9)。OSTaskCreate(Task_Main, (void *)0, (OS_STK *)amp。Stack2[STACKSIZE_L1], 12)。OSTaskCreate(Task_LCD, (void *)0, (OS_STK *)amp。Stack3[STACKSIZE_L1],59)。OSStart()。} FPGA控制ADC的程序設計 本系統(tǒng)的數據采集由ARM發(fā)出控制信號,FPGA響應控制信號后通過ADC來采集數據。采集到的數據先存放在FPGA內部的FIFO中,當采集完成一次或者FIFO達到半滿狀態(tài)產生外部中斷,此時ARM通過響應中斷來獲取數據。ARM對FPGA的控制是通過相關寄存器來實現,寄存器的執(zhí)行方式則在FPGA內部通過硬件描述語言Verilog來定義。 關于相關寄存器的地址、長度、名稱和功能已經在第三章第二節(jié)進行了詳細的描述,在此不再累述。下面將對如何控制各寄存器的功能進行細致的介紹:1. SCR系統(tǒng)控制寄存器15141312111098ReservedReservedReservedReservedReservedReservedReservedReservedR-0R-0R-0R-0R-0R-0R-0R-076543210ReservedReservedReservedReservedReservedFCLRMODERUNR-0R-0R-0R-0WR-0WR-0WR-0WR-0Note:R = Read access, W = Write access, S = Set only, 0 = value after reset SCR系統(tǒng)控制寄存器 ,第3-15位為保留位;第2位FCLR標志FIFO是否清空:0-不清空FIFO,1-清空FIFO;第1位MODE為模式標志位:0-被動模式,1-主動模式;第0位RUN為運行標志位:0-停止運行,1-正在運行。2. SSR系統(tǒng)狀態(tài)寄存器15141312111098ReservedReservedReservedReservedReservedReservedReservedReservedR-0R-0R-0R-0R-0R-0R-0R-076543210ReservedReservedReservedReservedPMOFCYCDFEMPFHFR-0R-0R-0R-0R-0WR-0WR-1R-0Note:R = Read access, W = Write access, S = Set only, 0 = value after reset SSR系統(tǒng)狀態(tài)寄存器 ,第4-15位為保留位;第3位PMOF標志被動模式單次循環(huán)計數是否少于預設值:0-沒少于,1-少于,寫入1清零;第2位CYCD標志單次循環(huán)是否完成一次:0-已經完成,1-沒有完成,寫入1清零;第1位FEMP為檢測FIFO是否清空標志位:0-FIFO中有數據,1-FIFO中沒有數據;第0位FHF為FIFO半滿標志位:0-FIFO還沒有半滿,1-FIFO已經達到半滿或以上。3. 控制的具體實現178。 被動模式:l 初始化AMC:數字等于循環(huán)周期除以20us然后減1,比如循環(huán)周期等于80ms,AMC=80000/20-1=3999。l 初始化SCR和SSR:SCR=100,SCR=000,SSR=1100;l 啟動采集程序:開始SCR=001;l 等待中斷,進入中斷以后檢查SSR:如果SSR==0001,那么讀取2048個字節(jié)數據;如果SSR==01x0,那么CPU內部循環(huán)計數器加1,然后寫入SSR=0100;如果SSR==1xxx,初始化的AMC數值過小,應該重新計算AMC值;l 如果上次中斷以后40ms還沒有進入新的中斷,此時可能是故障或者整個采樣過程結束,如果采樣結束,需要讀取FIFOC,然后讀取FIFOC中數值個FIFOD的數據,就是把FIFO的數據都讀出來;178。 主動模式(與被動模式一樣,除了):l 不會有SSR==1xxx情況;l 整個采樣過程的結束需要軟件寫入SCR=0x0來結束;4. FPGA內部異步FIFO的實現 FIFO作為一種數據緩沖器,其數據存放結構和RAM是一致的,只是存取方式有所不同。RAM中的各存儲單元可以被隨機讀寫,而FIFO只能按著先進先出的原則讀寫。另外,FIFO需要兩個地址寄存器,分別存儲讀地址(隊首元素地址)和寫地址(隊尾元素地址加1),讀寫過程中FIFO所存儲的信息并不移動,而是通過改變讀地址或者寫地址來指示隊首隊尾[11]。 空/滿標志的產生是FIFO的核心部分,正確設計與否,將直接影響FIFO的性能。本設計應用的方法是:分別將讀﹑寫地址寄存器擴展一位,將最高位設置為狀態(tài)位。當讀寫指針的地址位和狀態(tài)位完全相同時,表明讀寫指針經歷了相同次數的循環(huán),即FIFO處于空狀態(tài);如果當讀寫指針的地址位相同而狀態(tài)位相反,表明寫指針比讀指針多循環(huán)一次,即FIFO處于滿狀態(tài)。l 功能模塊劃分 本方案實現的FIFO是16位數據寬度,深度為4096,主要分為三個功能模塊:,讀寫地址產生模塊,RAM模塊,滿/空標志模塊。寫地址模塊的作用是寫信號使能后,每當采集完一次數據寫地址加一,在下一個單元保存新數據,雙端口RAM的作用是存儲數據,使讀和寫兩個過程互不影響。 FIFO內部結構l FIFO的實現FIFO核心模塊信號有:異步清零clr;讀寫使能rd/we;讀寫時鐘rdclk/weclk;讀寫數據dat_i/dat_o以及數據計數器t。數據在寫使能有效的情況下按照寫時鐘向FIFO里存儲,在讀使能的情況下,數據按照讀時鐘從FIFO到ARM的存儲器。這里需要注意的是:異步FIFO處于兩個不同的時鐘域,寫地址與讀地址是兩個不同時鐘域的數據,在進行操作前要經過同步。其Verilog的偽代碼如下:module adc_fifo ( //定義模塊信號量rclk, weclk, rst,dat_i, dat_o, we, rd, clr, full, empty,t )。always @ (posedge clk or posedge rst)begin如果rd使能且非空:進行讀操作,t1。如果we使能且非滿:進行寫操作,t+1。endassign empty = ~(|t)。 //當t所有位都為0,empty為1,否則empty為0assign full = t == DEPTH。//當滿足t == DEPTH,把t賦值給fullalways
點擊復制文檔內容
規(guī)章制度相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1