arm權威指南及我們組專案筆記

2021-06-18 19:28:36 字數 2531 閱讀 7488

1:關於新建立的task在執行函式時,怎樣得到它的兩個引數:stacd和exinf

在函式knl_setup_stacd中,還有權威指南p142.

就是說執行函式寫成:void task_test(int stacd, vp exinf)和void task_test(int stacd)都行

2:函式tk_rcv_mbf_impl中

queinsert(&knl_ctxtsk->tskque, &mbfcb->recv_queue);後

在函式tk_snd_mbf_impl中

tcb = (tcb*)mbfcb->recv_queue.next;直接取出tcb塊。

因為:tskque為knl_ctxtsk結構體的第乙個元素。

如果乙個結構體只插入到乙個鍊錶中的話,就只需要乙個tskque,而如果把這個tskque當成該結構體第乙個元素的話,就可以直接提取

該結構體

3:cmsis_os.h中

#define ostimerdef(name, function)  \

uint32_t os_timer_cb_##name[4]; \

const ostimerdef_t os_timer_def_##name = \

語句:陣列os_timer_cb_##name會自動被arm編譯器處理為4個位元組的對齊,不用你手工去做這個對齊工作;

4:#pragma arm section code = "_kernel_code_sc", rwdata = "_kernel_data_sc", rodata = "_kernel_const_sc"

以上每個kernel檔案中有這麼一行,主要是把相關資料歸結到相關段中。

應用程式中定義的一些東西歸結到.text .data等中去,而kernel中定義的東西歸結到_kernel_code_sc等這些段中。

可見生成的map檔案。

5:tk_rcv_mbf_impl裡面呼叫knl_make_wait(tmout);一定會設定peandsv懸浮中斷的吧?

因為如果不切換的話,在這個地方直接返回的話就不是超時等待了

但是一定發生切換的話,那麼tk_rcv_mbf_impl一定不能放到中斷上下文裡去執行吧,否則會fault伺候。

所以**到這個地方會切換,所以在tk_rcv_mbf_impl入口處檢查是否在中斷上下文。

實時作業系統的實時意思是指中斷的執行時間是確定的,如果在執行中斷時發生任務切換則肯定會造成時間的不確定性。

為什麼tk_rcv_mbf_impl不能在中斷上下文執行如果misellec為0的話。

ready佇列中可以有多個tcb塊,但是只有優先順序最高的tcb塊可以被執行。詳見knl_wait_release_ok函式,該函式不一定會去設定pendsv中斷,如果 被喚醒的優先順序不高於當前執行tcb的優先順序的話。但是跟上面的4中的必然會去設定pendsv中斷的那個分支**就不一樣了。

ready佇列中存在不同優先順序的所對應的佇列,永遠都執行最高優先順序佇列的首tcb。

ut-kernel的chg_pri函式也可以執行在中斷上下文中,只要改變的優先順序任務不為當前執行tcb,chg_pri是會立即造成任務切換的,也在大多數情況下吧。

ut-kernel的實時性表現在tk_sta_tsk中如果被啟動任務的優先順序高於readyque裡面的最高優先順序(也就是當前tcb)的話,會立刻執行這個被啟動的任務。

ts_dormant狀態是指任務的一次執行結束了。

ts_nonexist是指乙個任務被刪除了。

日本人的ut-kernel設計得還是挺嚴謹的,質量水平還是挺高的。每個api還都指明了

task

portion taskindependent

portion

dispatchdisabled

這三種狀態下的判斷。因為實時作業系統對應cpu晶元簡單,就是為了處理中斷而用的。

實時作業系統和分時的,通用的還是有區別的。

6:王san調查的問題結果查出來是棧溢位的問題.

bug現象:執行到knl_ifree_impl——》knl_removefreeque——》queinsert裡面第一條語句時,整個程式卡死原地不能往前執行。

首先分析彙編**找出卡住那條彙編指令(strd r0,r1 【r2,0】),然後看暫存器值有沒有什麼異常,結果發現r1暫存器值為0,r1+r2值為非常小的數,顯然是往錯誤的位址處寫記憶體了。

然後這條指令前面的一條指令,是給r1賦值的,把某個位址處0x1fff6a00的值載入到r1暫存器裡,顯然是這個位址處的值被破壞了,被改寫成0,導致後來r1裡的值也為0.

那麼可以用ds-5裡面的watch功能,監視這個位址處的值在什麼時候被破壞成0了?

通過又一次的程式執行過程中的監視,發現程式在執行ref_task函式的第一條指令a時,導致了上面的破壞,這時watch功能責令程式停止執行。

然後看這個指令a前面的一條指令為push操作,立刻想到看看此時的棧指標發現竟然為0x1fff6a00,所以此時棧肯定溢位了,導致破壞了這個與此時執行上下文(執行ref_task函式時)毫不相關的0x1fff6a00位址處內容。

那麼棧破壞了,結果對照**看到不是棧不夠用,是棧大小設定錯了,設定小了,結果導致不夠用。

Hadoop 權威指南

rpm包和deb包是兩種linux系統下最常見的安裝包格式,在安裝一些軟體或服務的時候免不了要和它們打交道。rpm包主要應用在redhat系列包括 fedora等發行版的linux系統上,deb包主要應用於debian系列包括現在比較流行的ubuntu等發行版上。yum可以用於運作rpm包,例如在f...

HTTP權威指南

web 伺服器會為所有 http 物件資料附加乙個 mime 型別,content type image jpeg,content length 12984 伺服器資源名被稱為統一資源識別符號 uniform resource identifier,uri uri 就像網際網路上的郵政位址一樣,在世...

KEEPLIAVED權威指南

vrrp通過224.0.0.18來實現 在vrrp中,不管誰是主,對外都是相同的mac和ip 作為主,必須不斷傳送vrrp包,告訴其他備,他是存活的 keepalived core,vrrp,check,libipfwc,libipvs keepalived對lvs進行封裝 keepalived配置...