[分享] SVC 系统服务调用
723 查看
1 回复
 楼主 | 发布于 2020-09-21 | 只看楼主
分享到:
不久之前,有客户想使用SVC(系统服务调用)功能,但是其创建的工程不是最后运行到某个奇怪的地址就是进入到Hardfault 中断中,很是苦恼。所以小编秉着“治病救人”的原则,创建了一个简单的SVC工程,所以特地与大家分享一下。
至于SVC(系统服务调用)功能的具体应用就不在这赘述了,有兴趣的话,大家可以在《ARM Cortex-M3 权威指南》中了解其功能的具体信息,如不想翻书,直接看此贴Cortex-M3 / M4 SVC Handler就行。

主程序代码如下所示,代码本身非常简单,只是起个抛砖引玉,是基于SDK中的Hello World工程完成的。


  1. /*
  2. * Copyright (c) 2013 - 2015, Freescale Semiconductor, Inc.
  3. * Copyright 2016-2017 NXP
  4. * All rights reserved.
  5. *
  6. * SPDX-License-Identifier: BSD-3-Clause
  7. */

  8. #include "fsl_device_registers.h"
  9. #include "fsl_debug_console.h"
  10. #include "board.h"

  11. #include "pin_mux.h"
  12. #include "clock_config.h"
  13. /*******************************************************************************
  14. * Definitions
  15. ******************************************************************************/
  16. #define SVC_0 0
  17. #define SVC_1 1

  18. void SVC_Executed_Handler( char* svc_args )
  19. {
  20.         PRINTF(svc_args);
  21. }





  22. void SVC_Handler_main( unsigned int * svc_args )  // R0 = ( PSP or MSP )
  23. {
  24.   /*
  25.    * Stack contains:
  26.    * r0, r1, r2, r3, r12, r14, the return address and xPSR
  27.    * First argument (r0) is svc_args[0]
  28.    */
  29.     unsigned int svc_number;

  30.     svc_number = ((char *)svc_args[6])[-2];

  31.   // ( SVC #0 ) 00 DF : XX XX XX XX <-- code will be executed after reti
  32.   // ( SVC #1 ) 01 DF : \______________ PC : (char *)svc_args[6])
  33.     switch(svc_number)
  34.     {
  35.     case SVC_0:
  36.             SVC_Executed_Handler("SVC_0 is triggered \r\n" );
  37.             break;

  38.     case SVC_1:
  39.             SVC_Executed_Handler("SVC_1 is triggered \r\n" );
  40.             break;

  41.     default:
  42.             break;
  43.     }
  44. }

  45. /*******************************************************************************
  46. * Prototypes
  47. ******************************************************************************/

  48. /*******************************************************************************
  49. * Code
  50. ******************************************************************************/
  51. /*!
  52. * @brief Main function
  53. */
  54. int main(void)
  55. {
  56.     char ch;

  57.     /* Init board hardware. */
  58.     BOARD_ConfigMPU();
  59.     BOARD_InitPins();
  60.     BOARD_InitBootClocks();
  61.     BOARD_InitDebugConsole();

  62.     PRINTF("hello world.\r\n");

  63.     asm("SVC #0");

  64.     while (1)
  65.     {
  66.         ch = GETCHAR();
  67.         PUTCHAR(ch);
  68.     }
  69. }
完整工程请下载附件。



本帖有更多资源,需 登录 才可以下载,没有帐号?立即 注册

(0 ) (0 )
回复 举报

回复于 2020-09-25 沙发

(0 )
评论 (0) 举报
  • 发表回复
    0/3000





    举报

    请选择举报类别

    • 广告垃圾
    • 违规内容
    • 恶意灌水
    • 重复发帖

    全部板块

    返回顶部