请教RTX中关于SVC的调用问题

2019-12-27 19:01发布


  1. #define __NO_RETURN __declspec(noreturn)

  2. #define osEvent_type       osEvent
  3. #define osEvent_ret_status ret
  4. #define osEvent_ret_value  ret
  5. #define osEvent_ret_msg    ret
  6. #define osEvent_ret_mail   ret

  7. #define osCallback_type    osCallback
  8. #define osCallback_ret     ret

  9. #define SVC_0_1(f,t,...)                                                      
  10. __svc_indirect(0) t  _##f (t(*)());                                            
  11.                   t     f (void);                                             
  12. __attribute__((always_inline))                                                
  13. static __inline   t __##f (void) {                                             
  14.   return _##f(f);                                                              
  15. }

  16. #define SVC_1_0(f,t,t1,...)                                                   
  17. __svc_indirect(0) t  _##f (t(*)(t1),t1);                                       
  18.                   t     f (t1 a1);                                             
  19. __attribute__((always_inline))                                                
  20. static __inline   t __##f (t1 a1) {                                            
  21.   _##f(f,a1);                                                                  
  22. }

  23. #define SVC_1_1(f,t,t1,...)                                                   
  24. __svc_indirect(0) t  _##f (t(*)(t1),t1);                                       
  25.                   t     f (t1 a1);                                             
  26. __attribute__((always_inline))                                                
  27. static __inline   t __##f (t1 a1) {                                            
  28.   return _##f(f,a1);                                                           
  29. }

  30. #define SVC_2_1(f,t,t1,t2,...)                                                
  31. __svc_indirect(0) t  _##f (t(*)(t1,t2),t1,t2);                                 
  32.                   t     f (t1 a1, t2 a2);                                      
  33. __attribute__((always_inline))                                                
  34. static __inline   t __##f (t1 a1, t2 a2) {                                    
  35.   return _##f(f,a1,a2);                                                        
  36. }

  37. #define SVC_3_1(f,t,t1,t2,t3,...)                                             
  38. __svc_indirect(0) t  _##f (t(*)(t1,t2,t3),t1,t2,t3);                           
  39.                   t     f (t1 a1, t2 a2, t3 a3);                              
  40. __attribute__((always_inline))                                                
  41. static __inline   t __##f (t1 a1, t2 a2, t3 a3) {                              
  42.   return _##f(f,a1,a2,a3);                                                     
  43. }

  44. #define SVC_4_1(f,t,t1,t2,t3,t4,...)                                          
  45. __svc_indirect(0) t  _##f (t(*)(t1,t2,t3,t4),t1,t2,t3,t4);                     
  46.                   t     f (t1 a1, t2 a2, t3 a3, t4 a4);                        
  47. __attribute__((always_inline))                                                
  48. static __inline   t __##f (t1 a1, t2 a2, t3 a3, t4 a4) {                       
  49.   return _##f(f,a1,a2,a3,a4);                                                  
  50. }

  51. #define SVC_1_2 SVC_1_1
  52. #define SVC_1_3 SVC_1_1
  53. #define SVC_2_3 SVC_2_1
复制代码

如上代码,只是知道这段代码的意思是在非特权等级下通过SVC来调用内核代码,但是不晓得其中原理是什么,还请各位高手指点一下!多谢。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
XIVN1987
1楼-- · 2019-12-27 19:05

Keil帮助中__svc_indirect条目下有有说明,大概是:
t  _##f (t(*)(t1),t1); 被__svc_indirect(0)修饰了,所以当使用_##f(f,a1);调用_##f时,会将函数f的地址存入R12寄存器中,然后执行SVC 0触发SVC_Handler,在SVC_Handler中通过R12寄存器调用真正的功能函数f

QQ截图20170525152356.png (22.13 KB, 下载次数: 0)

下载附件

2017-5-25 15:24 上传

一周热门 更多>