精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

鴻蒙輕內核M核源碼分析系列十八Fault異常處理

開發 前端
Fault異常處理模塊與OpenHarmony LiteOS-M內核芯片架構相關,本文先簡單介紹下Fault異常類型,向量表及其代碼,異常處理C語言程序,然后詳細分析下異常處理匯編函數實現代碼。

[[430071]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

Fault異常處理模塊與OpenHarmony LiteOS-M內核芯片架構相關,提供對HardFault、MemManage、BusFault、UsageFault等各種故障異常處理。有關Cortex-M芯片相關的知識不在本文討論,請自行參考《Cortex™-M7 Devices Generic User Guide》等官方資料。本文先簡單介紹下Fault異常類型,向量表及其代碼,異常處理C語言程序,然后詳細分析下異常處理匯編函數實現代碼。

1、Fault Type異常類型

如下圖中的Fault類型表格所示,Fault表示各種故障,Handler表示故障處理機制,Bit Name標記故障的寄存器的Bit位,Fault status register故障狀態寄存器。該圖摘自《Cortex™-M7 Devices Generic User Guide》。

鴻蒙輕內核M核源碼分析系列十八 Fault異常處理-鴻蒙HarmonyOS技術社區
鴻蒙輕內核M核源碼分析系列十八 Fault異常處理-鴻蒙HarmonyOS技術社區

2、Vector table向量表

向量表包含棧指針的復位值和開始地址,也叫異常向量。異常可以看作特殊的中斷,異常編號Exception number, 中斷請求號IRQ number,偏移值offset,向量Vector的對應關系如下圖所示,本文主要關注NMI、HardFault、Memory management fault、Bus fault、Usage fault、SVCall等異常。

鴻蒙輕內核M核源碼分析系列十八 Fault異常處理-鴻蒙HarmonyOS技術社區
[[430072]]

在中斷初始化時,會初始化該異常向量表,代碼位置kernel\arch\arm\cortex-m7\gcc\los_interrupt.c。⑴處的HalExcNMI,⑵處的HalExcHardFault,⑶處的HalExcMemFault,⑷處的HalExcBusFault,⑸處的HalExcUsageFault,⑹處的HalExcSvcCall這些中斷異常處理函數定義在kernel\arch\arm\cortex-m7\gcc\los_exc.S。本文我們主要分析這些匯編函數的代碼。

⑺處開始的這兩行代碼也比較重要,通過更改系統處理控制與狀態寄存器(System Handler Control and State Register)的bit位來使能相應的異常,通過更改配置與控制寄存器(Configuration and Control Register)的bit位來使能除零異常。

  1. LITE_OS_SEC_TEXT_INIT VOID HalHwiInit(VOID) 
  2. #if (LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT == 1) 
  3.     UINT32 index
  4.     g_hwiForm[0] = 0;             /* [0] Top of Stack */ 
  5.     g_hwiForm[1] = Reset_Handler; /* [1] reset */ 
  6.     for (index = 2; index < OS_VECTOR_CNT; index++) { /* 2: The starting position of the interrupt */ 
  7.         g_hwiForm[index] = (HWI_PROC_FUNC)HalHwiDefaultHandler; 
  8.     } 
  9.     /* Exception handler register */ 
  10. ⑴  g_hwiForm[NonMaskableInt_IRQn + OS_SYS_VECTOR_CNT]   = HalExcNMI; 
  11. ⑵  g_hwiForm[HARDFAULT_IRQN + OS_SYS_VECTOR_CNT]        = HalExcHardFault; 
  12. ⑶  g_hwiForm[MemoryManagement_IRQn + OS_SYS_VECTOR_CNT] = HalExcMemFault; 
  13. ⑷  g_hwiForm[BusFault_IRQn + OS_SYS_VECTOR_CNT]         = HalExcBusFault; 
  14. ⑸  g_hwiForm[UsageFault_IRQn + OS_SYS_VECTOR_CNT]       = HalExcUsageFault; 
  15. ⑹  g_hwiForm[SVCall_IRQn + OS_SYS_VECTOR_CNT]           = HalExcSvcCall; 
  16.     g_hwiForm[PendSV_IRQn + OS_SYS_VECTOR_CNT]           = HalPendSV; 
  17.     g_hwiForm[SysTick_IRQn + OS_SYS_VECTOR_CNT]          = SysTick_Handler; 
  18.  
  19.     /* Interrupt vector table location */ 
  20.     SCB->VTOR = (UINT32)(UINTPTR)g_hwiForm; 
  21. #endif 
  22. #if (__CORTEX_M >= 0x03U) /* only for Cortex-M3 and above */ 
  23.     NVIC_SetPriorityGrouping(OS_NVIC_AIRCR_PRIGROUP); 
  24. #endif 
  25.  
  26.     /* Enable USGFAULT, BUSFAULT, MEMFAULT */ 
  27. ⑺  *(volatile UINT32 *)OS_NVIC_SHCSR |= (USGFAULT | BUSFAULT | MEMFAULT); 
  28.     /* Enable DIV 0 and unaligned exception */ 
  29.     *(volatile UINT32 *)OS_NVIC_CCR |= DIV0FAULT; 
  30.  
  31.     return

3、HalExcHandleEntry異常處理C程序入口

HalExcHandleEntry異常處理函數是匯編異常函數跳轉到C語言程序的入口,定義在文件kernel\arch\arm\cortex-m7\gcc\los_interrupt.c,被kernel\arch\arm\cortex-m7\gcc\los_exc.S文件中的匯編函數調用。函數參數由匯編程序中的R0-R3寄存器傳值進來,匯編程序中的寄存器和HalExcHandleEntry函數參數對應關系如下表所示:

下面我們分析下函數的源代碼,⑴處的標簽表示異常類型參數的高16位用于特色的標記,主要用于標記故障地址是否有效、是否故障發生在中斷中,是否支持浮點等。⑵處增加中斷計數和嵌套異常數目。⑶記錄異常類型,⑷處如果記錄了有效的故障地址,則獲取故障地址。⑸處如果當前運行任務存在時,若標記了異常發生在中斷,則記錄中斷號,并記錄異常發生在中斷內,否則記錄任務編號,并記錄異常發生在任務內。如果當前運行任務為空,則異常發生在初始化階段。⑹處如果異常類型里包含支持浮點數的標記,則相應處理下。⑺處輸出異常信息到控制臺。

  1. LITE_OS_SEC_TEXT_INIT VOID HalExcHandleEntry(UINT32 excType, UINT32 faultAddr, UINT32 pid, EXC_CONTEXT_S *excBufAddr) 
  2. ⑴  UINT16 tmpFlag = (excType >> 16) & OS_NULL_SHORT; /* 16: Get Exception Type */ 
  3. ⑵  g_intCount++; 
  4.     g_excInfo.nestCnt++; 
  5.  
  6. ⑶  g_excInfo.type = excType & OS_NULL_SHORT; 
  7.  
  8. ⑷  if (tmpFlag & OS_EXC_FLAG_FAULTADDR_VALID) { 
  9.         g_excInfo.faultAddr = faultAddr; 
  10.     } else { 
  11.         g_excInfo.faultAddr = OS_EXC_IMPRECISE_ACCESS_ADDR; 
  12.     } 
  13. ⑸  if (g_losTask.runTask != NULL) { 
  14.         if (tmpFlag & OS_EXC_FLAG_IN_HWI) { 
  15.             g_excInfo.phase = OS_EXC_IN_HWI; 
  16.             g_excInfo.thrdPid = pid; 
  17.         } else { 
  18.             g_excInfo.phase = OS_EXC_IN_TASK; 
  19.             g_excInfo.thrdPid = g_losTask.runTask->taskID; 
  20.         } 
  21.     } else { 
  22.         g_excInfo.phase = OS_EXC_IN_INIT; 
  23.         g_excInfo.thrdPid = OS_NULL_INT; 
  24.     } 
  25. ⑹  if (excType & OS_EXC_FLAG_NO_FLOAT) { 
  26.         g_excInfo.context = (EXC_CONTEXT_S *)((CHAR *)excBufAddr - LOS_OFF_SET_OF(EXC_CONTEXT_S, uwR4)); 
  27.     } else { 
  28.         g_excInfo.context = excBufAddr; 
  29.     } 
  30.  
  31. ⑺  OsDoExcHook(EXC_INTERRUPT); 
  32.     OsExcInfoDisplay(&g_excInfo); 
  33.     HalSysExit(); 

4、Los_Exc異常處理匯編函數

上文介紹Vector table向量表時,已經提到了在文件kernel\arch\arm\cortex-m7\gcc\los_exc.S中定義的的異常處理函數,如下。當發生Fault故障異常時,會調度執行這些異常處理函數,本節會詳細分析函數的源代碼來掌握內核如何處理這些發生的異常。這6個函數處理過程類似,我們選擇2個典型的函數進行分析。

  1. .global  HalExcNMI 
  2. .global  HalExcHardFault 
  3. .global  HalExcMemFault 
  4. .global  HalExcBusFault 
  5. .global  HalExcUsageFault 
  6. .global  HalExcSvcCall 

4.1 HalExcNMI

當發生NMI(Non Maskable Interrupt,不可屏蔽中斷)時,會觸發運行HalExcNMI匯編函數,該函數的執行流程如下圖。下文會結合該流程圖來閱讀函數代碼。

鴻蒙輕內核M核源碼分析系列十八 Fault異常處理-鴻蒙HarmonyOS技術社區

HalExcNMI函數代碼如下,⑴處給R0寄存器賦值OS_EXC_CAUSE_NMI,該值等于16,對應文件kernel\arch\arm\cortex-m7\gcc\los_arch_interrupt.h中的異常類型宏定義OS_EXC_CAUSE_NMI,均為16。該值對應HalExcHandleEntry函數的第一個參數。⑵處設置故障地址,該值對應HalExcHandleEntry函數的第二個參數。⑶處跳轉到函數osExcDispatch繼續執行。

  1.    .type HalExcNMI, %function 
  2.     .global HalExcNMI 
  3. HalExcNMI: 
  4.     .fnstart 
  5.     .cantunwind 
  6. ⑴  MOV  R0, #OS_EXC_CAUSE_NMI 
  7. ⑵  MOV  R1, #0 
  8. ⑶  B  osExcDispatch 
  9.     .fnend 

下面分析的一些函數比較通用,其他異常處理函數也都會調用。

4.1.1 osExcDispatch函數

osExcDispatch函數代碼如下,⑴處加載Interrupt Active Bit Registers中斷活躍位寄存器基地址。中斷活躍位寄存器共有8個,NVIC_IABR0-NVIC_IABR7,每個寄存器包含32位,可以對應32個中斷號,共支持256個中斷。其中,IABR[0]的 bit位0~31 分別對應中斷號031;`IABR[1]`的bit位031對應中斷32~63;其他以此類推。⑵處設置循環計數,對應8個寄存器,后文會循環遍歷8個寄存器查詢是否存在活躍的中斷。

  1.   .type osExcDispatch, %function 
  2.     .global osExcDispatch 
  3. osExcDispatch: 
  4.     .fnstart 
  5.     .cantunwind 
  6. ⑴  LDR   R2, =OS_NVIC_ACT_BASE 
  7. ⑵  MOV   R12, #8                       // R12 is hwi check loop counter 
  8.     .fnend 

4.1.2 _hwiActiveCheck函數

執行完上述osExcDispatch函數代碼后,會繼續執行隨后的函數_hwiActiveCheck的代碼。⑴處讀取活躍位寄存器的數值,然后執行⑵比較寄存器數值與0的大小,如果相等,說明該活躍位寄存器對應的中斷均不活躍,然后跳轉到_hwiActiveCheckNext。如果不等于0,則執行⑶,參數類型的高16位標記為中斷。⑷處代碼根據中斷活躍位計算中斷號,并賦值給寄存器R2,該值對應HalExcHandleEntry函數的第三個參數。具體計算方式為,首先反轉活躍中斷位寄存器數值R3,并保存到R2,然后計算高位0的數量。把計數值R12加1,然后左移5位(等于乘以32),然后加上R2,就是中斷號。

  1.     .type _hwiActiveCheck, %function 
  2.     .global _hwiActiveCheck 
  3. _hwiActiveCheck: 
  4.     .fnstart 
  5.     .cantunwind 
  6. ⑴  LDR   R3, [R2]                      // R3 store active hwi register when exc 
  7. ⑵  CMP   R3, #0 
  8.     BEQ   _hwiActiveCheckNext 
  9.  
  10.     // exc occurred in IRQ 
  11. ⑶  ORR   R0, R0, #FLAG_HWI_ACTIVE 
  12. ⑷  RBIT  R2, R3 
  13.     CLZ   R2, R2 
  14.     AND   R12, R12, #1 
  15.     ADD   R2, R2, R12, LSL #5               // calculate R2 (hwi number) as pid 
  16.     .fnend 

4.1.3 _ExcInMSP函數和_NoFloatInMsp函數

如果有活躍的中斷,則繼續執行后續的代碼。處理中斷時,使用的主棧處理函數_ExcInMSP。⑴處比較異常返回值和#0XFFFFFFED的大小,如果相等說明支持浮點計算則繼續執行后續代碼,如果不相等則不支持浮點計算,會跳轉到函數_NoFloatInMsp函數。有關異常返回值的更多信息請參考《Cortex™-M7 Devices Generic User Guide》表格Table 2-15 Exception return behavior。

如果支持浮點計算時,執行⑵把棧指針加上104賦值給R3寄存器,然后壓棧,該值對應HalExcHandleEntry函數的第四個參數。104的大小應該來源于結構體EXC_CONTEXT_S。⑶處把寄存器PRIMASK數值復制到R12寄存器,然后把R4-R12寄存器壓棧。⑷處把浮點寄存器壓棧,⑸處跳轉到函數_handleEntry。

當不支持浮點計算時,執行函數_NoFloatInMsp。⑹處把棧指針加上32賦值給R3寄存器,然后壓棧,該值對應HalExcHandleEntry函數的第四個參數。然后把R3壓棧,把寄存器PRIMASK數值復制到R12,然后壓棧R4-R12。和支持浮點時的差別就是,不需要壓棧D8-D15寄存器。⑺處把參數類型高位上加上不支持浮點的標記,然后跳轉到函數_handleEntry。

  1.   .type _ExcInMSP, %function 
  2.     .global _ExcInMSP 
  3. _ExcInMSP: 
  4.     .fnstart 
  5.     .cantunwind 
  6. ⑴  CMP   LR, #0XFFFFFFED 
  7.     BNE   _NoFloatInMsp 
  8. ⑵  ADD   R3, R13, #104 
  9.     PUSH  {R3} 
  10. ⑶  MRS   R12, PRIMASK                  // store message-->exc: disable int? 
  11.     PUSH {R4-R12}                       // store message-->exc: {R4-R12} 
  12. #if ((defined(__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ 
  13.      (defined(__FPU_USED) && (__FPU_USED == 1U))) 
  14. ⑷  VPUSH {D8-D15} 
  15. #endif 
  16. ⑸  B     _handleEntry 
  17.   .fnend 
  18.  
  19.     .type _NoFloatInMsp, %function 
  20.     .global _NoFloatInMsp 
  21. _NoFloatInMsp: 
  22.     .fnstart 
  23.     .cantunwind 
  24. ⑹  ADD   R3, R13, #32 
  25.     PUSH  {R3} // save IRQ SP            // store message-->exc: MSP(R13) 
  26.  
  27.     MRS   R12, PRIMASK                  // store message-->exc: disable int? 
  28.     PUSH {R4-R12}                       // store message-->exc: {R4-R12} 
  29. ⑺  ORR   R0, R0, #FLAG_NO_FLOAT 
  30.     B     _handleEntry 
  31.   .fnend 

4.1.4 _hwiActiveCheckNext函數

遍歷中斷活躍位寄存器時,如果前一個寄存器沒有活躍的中斷則執行函數_hwiActiveCheckNext判斷下一個寄存器是否有活躍的中斷。⑴處把活躍位寄存器地址偏移4字節,計數減1,如果還有其他活躍位寄存器,則跳轉到函數_hwiActiveCheck繼續判斷。否則執行后續的代碼,⑵處加載System Handler Control and State Register(縮寫SHCSRS)系統處理控制與狀態寄存器的地址,然后加載半字節數值。⑶處加載掩碼0xC00,該數值二進制的第10、第11位為1。SHCSRS寄存器的第11位對應SysTick異常活躍位,第10位對應PendSV異常活躍位。⑷處R2、R3進行邏輯與計算,然后把結果與0進行比較,如果結果為0,說明沒有發生ysTick異常或PendSV異常。如果結果為1,說明發生了異常,需要執行⑸跳轉到函數_ExcInMSP繼續執行,上文已分析該函數。⑹處獲取全局變量g_taskScheduled的地址,然后獲取其數值,與1進行比較。如果等于1,說明系統已經開始任務調度,會繼續執行后續的代碼。如果不為1,系統未調度,處于初始化階段,需要跳轉到函數_ExcInMSP繼續執行。

如果系統開始了任務調度,此時使用進程棧PSP,執行⑺,判斷系統是否支持浮點計算。如果支持則繼續執行,否則跳轉到函數_NoFloatInPsp。⑻處開始的代碼和函數_NoFloatInPsp可以對比著閱讀,前者需要壓棧浮點寄存器,后者不需要。⑻處把棧指針復制到R2寄存器,然后把棧指針減去96。⑼處把PSP線程棧指針值賦值給R3寄存器,然后把R3加104賦值給寄存器R12,計算出來的值是任務棧指針,然后進行壓棧。

⑽處復制PRIMASK寄存器數值到R12,然后把寄存器R4-R12壓棧,接著壓棧浮點寄存器D8-D15。⑾處從PSP棧指針開始把R4-R11、D8-D15出棧,然后從R13棧指針開始把D8-D15、R4-R11進行壓棧。⑿處跳轉到函數_handleEntry繼續指向。

  1.   .type _hwiActiveCheckNext, %function 
  2.     .global _hwiActiveCheckNext 
  3. _hwiActiveCheckNext: 
  4.     .fnstart 
  5.     .cantunwind 
  6. ⑴  ADD   R2, R2, #4                        // next NVIC ACT ADDR 
  7.     SUBS  R12, R12, #1 
  8.     BNE   _hwiActiveCheck 
  9.  
  10.     /*NMI interrupt exception*/ 
  11. ⑵  LDR   R2, =OS_NVIC_SHCSRS 
  12.     LDRH  R2,[R2] 
  13. ⑶  LDR   R3,=OS_NVIC_SHCSR_MASK 
  14. ⑷  AND   R2, R2,R3 
  15.     CMP   R2,#0 
  16. ⑸  BNE   _ExcInMSP 
  17.     // exc occured in Task or Init or exc 
  18.     // reserved for register info from task stack 
  19.  
  20. ⑹  LDR  R2, =g_taskScheduled 
  21.     LDR  R2, [R2] 
  22.     TST  R2, #1                         // OS_FLG_BGD_ACTIVE 
  23.     BEQ  _ExcInMSP                      // if exc occurred in Init then branch 
  24.  
  25.  
  26. ⑺  CMP   LR, #0xFFFFFFED               //auto push floating registers 
  27.     BNE   _NoFloatInPsp 
  28.  
  29.     // exc occurred in Task 
  30. ⑻  MOV   R2,  R13 
  31.     SUB   R13, #96                      // add 8 Bytes reg(for STMFD) 
  32.  
  33. ⑼  MRS   R3,  PSP 
  34.     ADD   R12, R3, #104 
  35.     PUSH  {R12}                         // save task SP 
  36.  
  37. ⑽  MRS   R12, PRIMASK 
  38.     PUSH {R4-R12} 
  39.     VPUSH {D8-D15} 
  40.  
  41.     // copy auto saved task register 
  42.  
  43. ⑾  LDMFD R3!, {R4-R11}                  // R4-R11 store PSP reg(auto push when exc in task) 
  44.     VLDMIA  R3!, {D8-D15} 
  45.     VSTMDB  R2!, {D8-D15} 
  46.     STMFD R2!, {R4-R11} 
  47. ⑿  B     _handleEntry 
  48.   .fnend 
  49.  
  50.     .type _NoFloatInPsp, %function 
  51.     .global _NoFloatInPsp 
  52. _NoFloatInPsp: 
  53.     .fnstart 
  54.     .cantunwind 
  55.     MOV   R2,  R13                      // no auto push floating registers 
  56.     SUB   R13, #32                      // add 8 Bytes reg(for STMFD) 
  57.  
  58.     MRS   R3,  PSP 
  59.     ADD   R12, R3, #32 
  60.     PUSH  {R12}                         // save task SP 
  61.  
  62.     MRS   R12, PRIMASK 
  63.     PUSH {R4-R12} 
  64.  
  65.     LDMFD R3, {R4-R11}                  // R4-R11 store PSP reg(auto push when exc in task) 
  66.     STMFD R2!, {R4-R11} 
  67.     ORR   R0, R0, #FLAG_NO_FLOAT 
  68.   .fnend 

4.1.5 _handleEntry函數

繼續分析函數_handleEntry。代碼很簡單,⑴把棧指針復制給R3,該值對應HalExcHandleEntry函數的第四個參數。⑵處關閉中斷,關閉Fault異常,然后執行⑵跳轉到C語言的函數HalExcHandleEntry。

  1. _handleEntry: 
  2.     .fnstart 
  3.     .cantunwind 
  4. ⑴  MOV R3, R13                         // R13:the 4th param 
  5. ⑵  CPSID I 
  6.     CPSID F 
  7.     B  HalExcHandleEntry 
  8.  
  9.     NOP 
  10.   .fnend 

4.2 HalExcUsageFault

當發生使用異常UsageFault時,會觸發運行HalExcUsageFault匯編函數,該函數的執行流程如下圖。下文會結合該流程圖來閱讀函數代碼。

鴻蒙輕內核M核源碼分析系列十八 Fault異常處理-鴻蒙HarmonyOS技術社區

HalExcUsageFault函數代碼如下,⑴處把可配置故障狀態寄存器Configurable Fault Status Register(CFSR)的地址復制到R0寄存器,然后讀取寄存器值到R0寄存器。⑵處把0x030F賦值給R1寄存器,然后左移16位。UsageFault Status Register使用故障狀態寄存器的有效性如下,即0-3,8-9為有效位,0x030F的二進制對應這些有效位。⑶處進行邏輯與,這樣就計算出實際的使用故障對應的bit位。⑷處把R12賦值為0,然后會繼續執行后續的匯編代碼osExcCommonBMU。

鴻蒙輕內核M核源碼分析系列十八 Fault異常處理-鴻蒙HarmonyOS技術社區
[[430073]]
  1.    .type HalExcUsageFault, %function 
  2.     .global HalExcUsageFault 
  3. HalExcUsageFault: 
  4.     .fnstart 
  5.     .cantunwind 
  6. ⑴  LDR  R0, =OS_NVIC_FSR 
  7.     LDR  R0, [R0] 
  8.  
  9. ⑵  MOVW  R1, #0x030F 
  10.     LSL  R1, R1, #16 
  11. ⑶  AND  R0, R0, R1 
  12. ⑷  MOV  R12, #0 
  13.  
  14.     .fnend 

4.2.1 g_uwExcTbl數組

在看osExcCommonBMU函數的代碼之前需要了解下g_uwExcTbl數組,g_uwExcTbl數組定義在文件kernel\arch\arm\cortex-m7\gcc\los_interrupt.c,代碼如下。

該數組包含32個元素,每個元素對應CFSR寄存器的一個bit位,元素數值在LiteOS-M中定義為異常類型。比如OS_EXC_UF_DIVBYZERO等于異常類型10,為除零異常。

  1. UINT8 g_uwExcTbl[FAULT_STATUS_REG_BIT] = { 
  2.     0, 0, 0, 0, 0, 0, OS_EXC_UF_DIVBYZERO, OS_EXC_UF_UNALIGNED, 
  3.     0, 0, 0, 0, OS_EXC_UF_NOCP, OS_EXC_UF_INVPC, OS_EXC_UF_INVSTATE, OS_EXC_UF_UNDEFINSTR, 
  4.     0, 0, 0, OS_EXC_BF_STKERR, OS_EXC_BF_UNSTKERR, OS_EXC_BF_IMPRECISERR, OS_EXC_BF_PRECISERR, OS_EXC_BF_IBUSERR, 
  5.     0, 0, 0, OS_EXC_MF_MSTKERR, OS_EXC_MF_MUNSTKERR, 0, OS_EXC_MF_DACCVIOL, OS_EXC_MF_IACCVIOL 
  6. }; 

4.2.2 osExcCommonBMU函數

現在來分析下匯編代碼osExcCommonBMU。⑴處計算出R0數值的高位0的個數,加載數組全局變量g_uwExcTbl地址到R3寄存器,然后執行⑵計算是第幾個數組元素,加載元素值到R0寄存器。⑶處R0與R12進行邏輯或運算,沒有什么影響。R0對應HalExcHandleEntry函數的第一個參數。后續會繼續執行osExcDispatch函數,前文已經分析過。

  1.   .type osExcCommonBMU, %function 
  2.     .global osExcCommonBMU 
  3. osExcCommonBMU: 
  4.     .fnstart 
  5.     .cantunwind 
  6. ⑴  CLZ  R0, R0 
  7.     LDR  R3, =g_uwExcTbl 
  8. ⑵  ADD  R3, R3, R0 
  9.     LDRB R0, [R3] 
  10. ⑶  ORR  R0, R0, R12 
  11.     .fnend 

小結

本文介紹了Fault異常類型,向量表及其代碼,異常處理C語言程序,異常處理匯編函數實現代碼。

文章相關附件可以點擊下面的原文鏈接前往下載

https://harmonyos.51cto.com/resource/1344

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2022-01-12 10:50:23

鴻蒙HarmonyOS應用

2022-01-10 15:31:44

鴻蒙HarmonyOS應用

2021-06-04 09:57:49

鴻蒙HarmonyOS應用

2021-05-17 09:28:59

鴻蒙HarmonyOS應用

2021-05-08 15:14:50

鴻蒙HarmonyOS應用

2021-06-04 14:15:10

鴻蒙HarmonyOS應用

2021-05-25 09:28:34

鴻蒙HarmonyOS應用

2021-05-31 20:30:55

鴻蒙HarmonyOS應用

2022-03-11 20:23:14

鴻蒙源碼分析進程管理

2022-04-13 11:02:12

鴻蒙事件模塊事件Event

2022-03-03 18:28:28

Harmony進程任務管理模塊

2021-07-06 09:45:03

鴻蒙HarmonyOS應用

2021-09-22 14:36:32

鴻蒙HarmonyOS應用

2021-05-11 09:54:55

鴻蒙HarmonyOS應用

2021-05-27 09:43:56

鴻蒙HarmonyOS應用

2021-06-09 09:48:01

鴻蒙HarmonyOS應用

2021-05-21 09:25:11

鴻蒙HarmonyOS應用

2022-01-14 08:39:47

鴻蒙HarmonyOS應用

2021-05-10 15:05:56

鴻蒙HarmonyOS應用

2021-04-30 15:06:34

鴻蒙HarmonyOS應用
點贊
收藏

51CTO技術棧公眾號

国产偷久久久精品专区| 色偷偷av一区二区三区乱| 波多野结衣家庭教师在线播放| 少妇高潮一区二区三区69| 99国产精品自拍| 国产亚洲精品久久| 成人啪啪18免费游戏链接| 久久久久久久| 亚洲精品国产精华液| 麻豆亚洲一区| 国产精品老熟女视频一区二区| 亚洲免费播放| 久久中文字幕在线| 亚洲AV无码国产成人久久| 精品国产亚洲一区二区三区| 欧美视频在线观看 亚洲欧| 在线观看成人一级片| 午夜在线观看视频18| 看国产成人h片视频| 97色在线视频| 欧美三级在线免费观看| 欧美日韩中字| 日韩av网站在线| 亚洲 欧美 日韩系列| 三级中文字幕在线观看| 亚洲精品国产精华液| 亚洲日本理论电影| 午夜视频福利在线观看| 国产乱人伦偷精品视频免下载| 国产精品久久久久久久久久| 久草精品视频在线观看| 一本到12不卡视频在线dvd| 一区二区三区动漫| 大地资源二中文在线影视观看| 秋霞一区二区三区| 欧美日韩国产成人在线免费| 欧美精品一区免费| 牛牛电影国产一区二区| 亚洲婷婷综合久久一本伊一区| 日本不卡二区高清三区| 天堂在线中文资源| 国产精品主播直播| 成人激情在线观看| 伊人精品在线视频| 日本视频中文字幕一区二区三区 | 免费黄网在线观看| 欧美激情在线一区二区| 欧美少妇一区| 韩国三级在线观看久| 2020国产精品自拍| 欧美日韩在线精品一区二区三区| 亚洲 另类 春色 国产| jizz一区二区| 久久av一区二区三区亚洲| 国产综合无码一区二区色蜜蜜| 国产精品资源网站| 国产精品xxxx| 日韩一区二区三区在线观看视频| 99亚偷拍自图区亚洲| 精品国产免费一区二区三区| 四季av日韩精品一区| 99国内精品久久| 欧美精品与人动性物交免费看| 青青草在线视频免费观看| av激情亚洲男人天堂| 蜜桃91精品入口| 国产色a在线| 国产精品乱人伦| 国产成年人在线观看| 午夜伦理大片视频在线观看| 亚洲制服丝袜av| 91视频最新入口| 爱情电影社保片一区| 欧美性猛交一区二区三区精品 | 成人看片网页| 欧美精品国产精品| 久久久久亚洲av无码网站| 国产精品黄网站| 国产一区二区三区18| 国产又粗又长又硬| 午夜日韩在线| 69久久夜色精品国产7777| 亚洲欧美一区二区三区在线观看| 日本va欧美va欧美va精品| 国产一区二中文字幕在线看| 亚洲国产999| 91小视频在线免费看| 亚洲mv在线看| 丁香高清在线观看完整电影视频| 欧美性猛交xxxx免费看漫画 | 国产不卡高清在线观看视频| 欧美12av| 国产日产一区二区| 色综合欧美在线视频区| theporn国产精品| 思热99re视热频这里只精品| www日韩欧美| 伊人久久综合视频| 激情文学综合插| 麻豆91蜜桃| av免费在线免费| 日韩欧美在线一区| 能看毛片的网站| 欧美肉体xxxx裸体137大胆| 欧美激情2020午夜免费观看| 亚洲午夜无码久久久久| 成人精品国产福利| 亚洲精品成人a8198a| 都市激情国产精品| 欧美一区二区在线观看| 97在线观看免费视频| 亚洲国产专区校园欧美| 亚洲一区美女视频在线观看免费| 黑人与亚洲人色ⅹvideos| 亚洲国产视频在线| 午夜av中文字幕| sdde在线播放一区二区| 欧美在线激情视频| 丁香花免费高清完整在线播放 | 精品午夜福利在线观看| 欧美96一区二区免费视频| 狠狠色伊人亚洲综合网站色 | 91av福利视频| 国产成人a人亚洲精品无码| 日本一区二区动态图| 国产特级黄色大片| 9l视频自拍九色9l视频成人| 久久久国产视频| 亚洲资源在线播放| 国产视频一区二区在线| 5月婷婷6月丁香| www国产精品| 九九精品视频在线| 99热这里只有精品1| 国产精品视频一区二区三区不卡| 欧美aⅴ在线观看| 网曝91综合精品门事件在线| 性欧美暴力猛交69hd| 内射无码专区久久亚洲| 亚洲资源在线观看| 中文字幕视频观看| 一区在线播放| 国产伦精品一区二区三毛| 国产丝袜精品丝袜| 欧美成人一区二区| 欧美激情一区二区视频| 国产成人精品综合在线观看| 日韩中文在线字幕| 日韩精品视频一区二区三区| 欧美精品日韩三级| 国产成人免费看一级大黄| 亚洲精品中文在线观看| 欧美69精品久久久久久不卡 | 国产精品电影一区二区三区| 亚洲激情在线观看视频| 日韩精品久久| 91人人爽人人爽人人精88v| www在线视频| 精品人在线二区三区| 国产在线视频99| 97久久超碰国产精品| 一本色道无码道dvd在线观看| 国产精品嫩草影院在线看| 国产精品福利网| 蜜芽在线免费观看| 日韩视频免费观看高清完整版| 国产亚洲第一页| 91网站在线观看视频| 性刺激的欧美三级视频| 综合一区av| 国产一区二区视频在线免费观看 | 国产精品v亚洲精品v日韩精品| 国产亚洲福利社区| 日韩毛片一区| 啊v视频在线一区二区三区| 亚洲AV无码一区二区三区少妇 | 亚洲妇女av| 国产精品美乳一区二区免费 | 亚洲精品视频在线观看免费| 亚洲熟女乱综合一区二区三区 | 亚洲国产美女搞黄色| 女同毛片一区二区三区| 蜜桃视频第一区免费观看| 精品无码av无码免费专区| 日本成人a网站| 成人精品视频在线| 波多野结衣在线高清| 国产亚洲欧美另类中文| 国产福利视频导航| 色婷婷激情一区二区三区| www.av免费| www国产成人免费观看视频 深夜成人网| 亚洲人辣妹窥探嘘嘘| 国语对白精品一区二区| 亚洲第一在线综合在线| 国产精品流白浆在线观看| 国产精自产拍久久久久久蜜| 爱福利在线视频| 日韩亚洲欧美中文高清在线| 少妇高潮一区二区三区99小说 | 亚洲精品911| 在线观看日韩av先锋影音电影院| 欧美精品一区二区成人| 国产日韩精品一区二区三区| 无码人妻一区二区三区精品视频| 日韩二区在线观看| 精品丰满人妻无套内射| 99久久精品网| 欧美精品久久久| 超碰成人福利| 成人精品视频久久久久| 电影久久久久久| 68精品久久久久久欧美| 中文字幕在线观看网站| 色妞一区二区三区| 免费在线稳定资源站| 欧美精品一区二区三区很污很色的 | 色综合久久综合| 精品无码久久久久久久| 日韩理论片一区二区| 中文字幕免费高清| 成人av电影免费在线播放| 国产资源中文字幕| 久久精品国产精品青草| 国产精品无码一本二本三本色| 日韩亚洲在线| 久久99久久99精品| 欧美国产精品| 伊人久久av导航| re久久精品视频| 色视频一区二区三区| 亚洲欧美日本伦理| 久久久久久久免费| 免费萌白酱国产一区二区三区| 波多野结衣精品久久| 国产精品麻豆| 91在线免费观看网站| 国产在线不卡一区二区三区| 国产综合久久久久久| 国产精品成人国产| 国产精品专区h在线观看| 成人国产一区| 国产日韩欧美视频在线| 久久亚洲精品人成综合网| 国产精品亚洲片夜色在线| www.国产精品| 国产日韩专区在线| crdy在线观看欧美| 亚洲xxxx在线| 亚洲**毛片| 国产手机精品在线| 夜夜躁狠狠躁日日躁2021日韩| 久久免费一区| 欧美亚洲在线日韩| 伊人久久青草| 欧美成人日本| 亚洲不卡中文字幕无码| 久久久久国产精品一区二区| 日本www高清视频| 奇米精品一区二区三区四区| 亚洲天堂av一区二区| 国产精品亚洲视频| 中文字幕 日本| 久久精品夜色噜噜亚洲a∨| 国产欧美一区二区三区在线观看视频 | 91精品免费| 超碰cao国产精品一区二区| 久久综合九色综合久99| 精品久久久亚洲| 国产美女视频免费| 亚洲黄色毛片| 成人3d动漫一区二区三区| 久热成人在线视频| 野花视频免费在线观看| 91视频国产观看| 国产一二三四区在线| 一区二区成人在线| 日韩一区二区视频在线| 欧美美女一区二区在线观看| 亚洲国产综合网| 国产午夜精品一区理论片飘花| 免费在线观看黄| 久久久天堂国产精品女人| 成人自拍av| 成人精品在线观看| 黑色丝袜福利片av久久| 色综合久久av| 亚洲第一黄网| 国产aⅴ爽av久久久久| 成人激情综合网站| 少妇太紧太爽又黄又硬又爽小说| 亚洲欧美一区二区三区久本道91| 免费日韩一级片| 777xxx欧美| 美州a亚洲一视本频v色道| 久久精品精品电影网| av高清不卡| julia一区二区中文久久94| 国产毛片一区二区三区 | 一本色道88久久加勒比精品| 黄大色黄女片18第一次| 成av人片一区二区| av最新在线观看| 欧美性xxxx极品高清hd直播| 国产ts变态重口人妖hd| 正在播放亚洲1区| 欧美13videosex性极品| 91丝袜脚交足在线播放| 欧美色就是色| 中国丰满人妻videoshd| 国产成人精品免费网站| 神马午夜精品91| 色婷婷综合久久久中文一区二区| 亚洲国产一二三区| 久久精品国产99国产精品澳门| 日韩伦理三区| 久久久久久99| 亚洲免费大片| caopor在线| 亚洲黄色免费网站| 91久久久久久久久久久久| 亚洲欧美激情视频| 女人让男人操自己视频在线观看 | 国产精品精品久久久久久| 美女主播精品视频一二三四| 欧美交换配乱吟粗大25p| 精品一区在线看| 国产一区二区三区视频播放| 在线观看视频一区二区| 可以免费看污视频的网站在线| 久久久久久伊人| 成人三级毛片| 日本精品久久久久久久久久| 国产精品一区在线| 黄色片在线观看网站| 91精品久久久久久久99蜜桃| 五月天婷婷在线视频| 国产欧美精品一区二区| 成人精品天堂一区二区三区| 欧美综合在线观看视频| 久久精品一区二区三区不卡牛牛| 超碰超碰超碰超碰| 亚洲免费一在线| 88xx成人永久免费观看| 日韩免费av电影| 美国av一区二区| 美女av免费看| 欧美精品一二三| 91露出在线| 91香蕉国产在线观看| 亚洲精品中文字幕乱码| 精品国产午夜福利在线观看| 亚洲精品视频在线观看免费| 亚洲第一页视频| 性欧美xxxx视频在线观看| 欧美人与拘性视交免费看| caopor在线视频| 国产精品久线观看视频| 国产伦精品一区二区三区视频痴汉 | 激情成人午夜视频| 91精品国产91久久久久久吃药 | 国产无人区一区二区三区| 亚洲乱码国产乱码精品| 一区二区三区无码高清视频| 久久91视频| 久久99久久久久久| 91麻豆免费视频| 在线免费观看av片| 久久福利网址导航| 欧美爱爱网站| 婷婷免费在线观看| 亚洲最新视频在线播放| 瑟瑟在线观看| 国产免费一区视频观看免费| 欧美日韩午夜| 日本aaa视频| 7777精品伊人久久久大香线蕉完整版 | 欧美成人综合| 在线天堂www在线国语对白| 在线观看视频欧美| 中文在线手机av| 蜜桃视频成人| 国产一区二区三区在线观看免费| 国产精品成人aaaa在线| 国产亚洲免费的视频看| 秋霞一区二区三区| 99精品免费在线观看| 亚洲精品精品亚洲| 国产在线观看黄| 99三级在线| 日本系列欧美系列| 日韩欧美中文字幕一区二区| 中文字幕在线精品| 国产精品一线| 亚洲天堂av一区二区| 日韩欧美成人区| 18+激情视频在线| 丝袜足脚交91精品| 99久久综合国产精品| 国产女18毛片多18精品|