首页 论坛 原厂专区 NXP(freescale) MCU SVC 系统服务调用
分享到:
不久之前,有客户想使用SVC(系统服务调用)功能,但是其创建的工程不是最后运行到某个奇怪的地址就是进入到Hardfault 中断中,很是苦恼。所以小编秉着“治病救人”的原则,创建了一个简单的SVC工程,所以特地与大家分享一下。
至于SVC(系统服务调用)功能的具体应用就不在这赘述了,有兴趣的话,大家可以在《ARM Cortex-M3 权威指南》中了解其功能的具体信息,如不想翻书,直接看此贴Cortex-M3 / M4 SVC Handler就行。
主程序代码如下所示,代码本身非常简单,只是起个抛砖引玉,是基于SDK中的Hello World工程完成的。
-
/*
-
* Copyright (c) 2013 - 2015, Freescale Semiconductor, Inc.
-
* Copyright 2016-2017 NXP
-
* All rights reserved.
-
*
-
* SPDX-License-Identifier: BSD-3-Clause
-
*/
-
-
#include "fsl_device_registers.h"
-
#include "fsl_debug_console.h"
-
#include "board.h"
-
-
#include "pin_mux.h"
-
#include "clock_config.h"
-
/*******************************************************************************
-
* Definitions
-
******************************************************************************/
-
#define SVC_0 0
-
#define SVC_1 1
-
-
void SVC_Executed_Handler( char* svc_args )
-
{
-
PRINTF(svc_args);
-
}
-
-
-
-
-
-
void SVC_Handler_main( unsigned int * svc_args ) // R0 = ( PSP or MSP )
-
{
-
/*
-
* Stack contains:
-
* r0, r1, r2, r3, r12, r14, the return address and xPSR
-
* First argument (r0) is svc_args[0]
-
*/
-
unsigned int svc_number;
-
-
svc_number = ((char *)svc_args[6])[-2];
-
-
// ( SVC #0 ) 00 DF : XX XX XX XX <-- code will be executed after reti
-
// ( SVC #1 ) 01 DF : \______________ PC : (char *)svc_args[6])
-
switch(svc_number)
-
{
-
case SVC_0:
-
SVC_Executed_Handler("SVC_0 is triggered \r\n" );
-
break;
-
-
case SVC_1:
-
SVC_Executed_Handler("SVC_1 is triggered \r\n" );
-
break;
-
-
default:
-
break;
-
}
-
}
-
-
/*******************************************************************************
-
* Prototypes
-
******************************************************************************/
-
-
/*******************************************************************************
-
* Code
-
******************************************************************************/
-
/*!
-
* @brief Main function
-
*/
-
int main(void)
-
{
-
char ch;
-
-
/* Init board hardware. */
-
BOARD_ConfigMPU();
-
BOARD_InitPins();
-
BOARD_InitBootClocks();
-
BOARD_InitDebugConsole();
-
-
PRINTF("hello world.\r\n");
-
-
asm("SVC #0");
-
-
while (1)
-
{
-
ch = GETCHAR();
-
PUTCHAR(ch);
-
}
-
}
(0 )
(0 )
回复
举报
发表回复
块
导
航
举报
请选择举报类别
- 广告垃圾
- 违规内容
- 恶意灌水
- 重复发帖