OpenHarmony - 小型系統內核(LiteOS-A)(十)
十四、魔法鍵使用方法
使用場景
在系統運行出現無響應等情況時,可以通過魔法鍵功能確定系統是否被鎖中斷(魔法鍵也無響應)或者查看系統任務運行狀態等信息。
在中斷有響應的情況下,可以通過魔法鍵查看task信息中 cpup(CPU占用率)看是哪個任務長時間占用CPU導致系統其他任務無響應(一般為比較高優先級任務一直搶占CPU,導致低優先級任務無響應)。
使用配置
魔法鍵依賴于宏LOSCFG_ENABLE_MAGICKEY,在kernel/liteos_a中輸入make menuconfig命令。此時會彈出配置項,找到Debug選項并進入,在配置項中開啟“Enable MAGIC KEY”:
Debug ---> Enable MAGIC KEY;若關閉該選項,則魔法鍵失效(默認為選中的)。
說明: 可以在menuconfig中,將光標移動到LOSCFG_ENABLE_MAGICKEY上,輸入“?”,可以查看幫助信息。
使用方法
-
輸入“ctrl + r”鍵,打開魔法鍵檢測功能。
在連接UART或者USB轉虛擬串口的情況下,輸入“ctrl + r” 鍵,打開魔法鍵檢測功能,輸出 “Magic key on”;再輸入一次后,則關閉魔法鍵檢測功能,輸出“Magic key off”。魔法鍵功能如下:
-
ctrl + z:幫助鍵,輸出相關魔法鍵簡單介紹;
-
ctrl + t:輸出任務相關信息;
-
ctrl + p:系統主動進入panic,輸出panic相關信息后,系統會掛住;
-
ctrl + e:系統進行簡單完整性內存池檢查,檢查出錯會輸出相關錯誤信息,檢查正常會輸出“system memcheck over, all passed!”。
須知: 魔法鍵檢測功能打開情況下,如果需要通過UART或者USB轉虛擬串口輸入特殊字符需避免與魔法鍵值重復,否則魔法鍵會被誤觸發,而原有設計功能可能出現錯誤。
-
十五、用戶態異常信息說明
用戶態在運行過程中,可能由于各種原因出現用戶態系統異常,異常信息如下所示:
##################excFrom: User!####################
prefetch_abort fault fsr:0x5, far:0x00000000
Translation fault, section
excType: prefetch abort
processName = shell
processID = 3
process aspace = 0x01000000 -> 0x3f000000
taskName = shell
taskID = 4
task user stack = 0x3707d000 -> 0x3717d000
pc = 0x0
ulr = 0x2000424 in /bin/shell ---> 0x424
usp = 0x3717cd60fp = 0x3717cd64
R0 = 0x1
R1 = 0x0
R2 = 0x0
R3 = 0x1
R4 = 0x3717cf58
R5 = 0x0
R6 = 0x3717cf54
R7 = 0x200043c
R8 = 0x84
R9 = 0x229a7560
R10 = 0x0
R11 = 0x3717cd64
R12 = 0x0
CPSR = 0x40000030
***backtrace begin***
traceback 0 -- lr = 0x229123a4 fp = 0x0 lr in /lib/libc.so --> 0x213a4PID PPID PGID UID Status CPUUSE CPUUSE10s CPUUSE1s Policy Priority MTID TaskTotal Mode PName1 -1 1 0 Ready 0.0 0.0 0.0 RR 28 16 1 user init 2 -1 2 0 Pend 10.1 10.1 0.0 RR 0 0 14 kernel KProcess 3 1 3 0 Running 0.0 0.0 0.0 RR 28 4 1 user shell TID PID Status StackSize WaterLine Policy Priority MEMUSE TaskName16 1 Ready 0x3000 0x978 RR 31 0x8b0c init 0 2 Pend 0x1000 0x1d4 RR 5 0 ResourcesTask 2 2 Pend 0x4000 0x4ec RR 0 0 Swt_Task 3 2 Pend 0x4000 0x1d4 RR 1 0 system_wq 5 2 Pend 0x4000 0x1fc RR 9 0 SendToSer 6 2 PendTime 0x6000 0x204 RR 5 0 tcpip_thread 7 2 Pend 0x3000 0x1fc RR 5 0 sdmci_detect 8 2 Pend 0x4000 0x204 RR 5 0 USB_GIANT_Task 9 2 Pend 0x4000 0x204 RR 1 0 USB_NGIAN_ISOC_Task 10 2 Pend 0x4000 0x204 RR 2 0 USB_NGIAN_BULK_Task 11 2 Pend 0x4000 0x690 RR 5 0xbb0 USB_EXPLR_Task 12 2 Pend 0x4000 0x204 RR 5 0 USB_CXFER_Task 13 2 Pend 0x20000 0x1e4 RR 3 0xac20 eth_irq_Task 14 2 Pend 0x4000 0x1d4 RR 10 0 jffs2_gc_thread 15 2 Pend 0x2000 0x1f4 RR 4 0 hisi_frw 4 3 Running 0x3000 0x838 RR 31 0x1100 shell
system memcheck over, all passed!
其中,主要包含如下幾方面信息:
-
用戶態異常基本信息:
prefetch_abort fault fsr:0x5, far:0x00000000 Translation fault, section excType: prefetch abort processName = shell processID = 3 process aspace = 0x01000000 -> 0x3f000000 taskName = shell taskID = 4 task user stack = 0x3707d000 -> 0x3717d000
-
寄存器相關信息。
pc = 0x0 ulr = 0x2000424 in /bin/shell ---> 0x424 usp = 0x3717cd60fp = 0x3717cd64 R0 = 0x1 R1 = 0x0 R2 = 0x0 R3 = 0x1 R4 = 0x3717cf58 R5 = 0x0 R6 = 0x3717cf54 R7 = 0x200043c R8 = 0x84 R9 = 0x229a7560 R10 = 0x0 R11 = 0x3717cd64 R12 = 0x0 CPSR = 0x40000030
-
調用棧信息。
***backtrace begin*** traceback 0 -- lr = 0x229123a4 fp = 0x0 lr in /lib/libc.so --> 0x213a4
-
進程線程基本信息。
PID PPID PGID UID Status CPUUSE CPUUSE10s CPUUSE1s Policy Priority MTID TaskTotal Mode PName1 -1 1 0 Ready 0.0 0.0 0.0 RR 28 16 1 user init 2 -1 2 0 Pend 10.1 10.1 0.0 RR 0 0 14 kernel KProcess 3 1 3 0 Running 0.0 0.0 0.0 RR 28 4 1 user shell TID PID Status StackSize WaterLine Policy Priority MEMUSE TaskName16 1 Ready 0x3000 0x978 RR 31 0x8b0c init 0 2 Pend 0x1000 0x1d4 RR 5 0 ResourcesTask 2 2 Pend 0x4000 0x4ec RR 0 0 Swt_Task 3 2 Pend 0x4000 0x1d4 RR 1 0 system_wq 5 2 Pend 0x4000 0x1fc RR 9 0 SendToSer 6 2 PendTime 0x6000 0x204 RR 5 0 tcpip_thread 7 2 Pend 0x3000 0x1fc RR 5 0 sdmci_detect 8 2 Pend 0x4000 0x204 RR 5 0 USB_GIANT_Task 9 2 Pend 0x4000 0x204 RR 1 0 USB_NGIAN_ISOC_Task 10 2 Pend 0x4000 0x204 RR 2 0 USB_NGIAN_BULK_Task 11 2 Pend 0x4000 0x690 RR 5 0xbb0 USB_EXPLR_Task 12 2 Pend 0x4000 0x204 RR 5 0 USB_CXFER_Task 13 2 Pend 0x20000 0x1e4 RR 3 0xac20 eth_irq_Task 14 2 Pend 0x4000 0x1d4 RR 10 0 jffs2_gc_thread 15 2 Pend 0x2000 0x1f4 RR 4 0 hisi_frw 4 3 Running 0x3000 0x838 RR 31 0x1100 shell system memcheck over, all passed!
可以根據以上信息,分析用戶態異常的具體原因。