关于__CC_ARM 与 __ICCARM__与内存保护

#if defined ( __CC_ARM )    //针对的是MDK的编译环境

// MDK

#pragma pack (4)

__attribute__((section(".RAM_D3")))

static uint8_t uTxAdrr[10][5] = {                       

};

#pragma pack (4)

__attribute__((section(".RAM_D3")))

static uint8_t uRxData[10][5] = {0};

#elif  defined (__ICCARM__)  //针对的是IAR的编译环境

// IAR

#pragma location = 0x38000040

__no_init  uint8_t uTxAdrr[4][5] = {};

#pragma location = 0x38000060

__no_init  uint8_t uRxData[4][5] = {0};;

#endif

分析以下这段代码/**************************************************************************//** * @file core_cm3.c * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Source File * @version V1.30 * @date 30. October 2009 * * @note * Copyright (C) 2009 ARM Limited. All rights reserved. * * @par * ARM Limited (ARM) is supplying this software for use with Cortex-M * processor based microcontrollers. This file can be freely distributed * within development tools that are supporting such ARM based processors. * * @par * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. * ******************************************************************************/ #include <stdint.h> /* define compiler specific symbols */ #if defined ( __CC_ARM ) #define __ASM __asm /*!< asm keyword for ARM Compiler */ #define __INLINE __inline /*!< inline keyword for ARM Compiler */ #elif defined ( __ICCARM__ ) #define __ASM __asm /*!< asm keyword for IAR Compiler */ #define __INLINE inline /*!< inline keyword for IAR Compiler. Only avaiable in High optimization mode! */ #elif defined ( __GNUC__ ) #define __ASM __asm /*!< asm keyword for GNU Compiler */ #define __INLINE inline /*!< inline keyword for GNU Compiler */ #elif defined ( __TASKING__ ) #define __ASM __asm /*!< asm keyword for TASKI
最新发布
03-12
<think>好的,我需要回答用户关于CMSIS Cortex-M3核心外设访问层源文件分析及编译器特定符号定义的问题。首先,我应该回顾CMSIS的结构,特别是Core Peripheral Access Layer (CPAL)的作用。CPAL主要提供对内核外设如NVIC、SysTick等的寄存器定义和访问函数,这些通常以结构体和宏的形式实现。 接下来,编译器特定符号定义部分,不同的编译器(如GCC、IAR、ARMCC)有不同的内联汇编语法和属性关键字,CMSIS需要通过预处理器指令来处理这些差异,确保跨编译器兼容。比如使用__ASM、__INLINE等宏来抽象不同编译器的关键字。 然后,我需要检查用户提供的引用内容,尤其是引用[1]提到的宏定义准备,包括存储器映射基地址,这可能涉及将外设寄存器地址映射到结构体指针。引用[3]提到的cmsis_compiler.h文件是关键,它处理编译器特定的符号定义,如内联函数和中断处理修饰符。 需要确保回答结构清晰,分点说明核心内容和编译器符号的处理方法,并结合用户提供的引用,比如引用[3]中提到的修改cmsis_compiler.h来解决编译错误。最后生成相关问题,可能涉及CMSIS的优化、移植问题或其他组件的集成,如引用[2]提到的I2C驱动配置和引用[4]的固件库关联。 需要验证是否有遗漏点,例如寄存器定义的结构体对齐、位域定义是否使用volatile,以及中断函数声明的编译器属性(如__IRQ)。确保回答准确,并正确引用用户提供的参考资料,特别是引用[1]和[3]的相关部分。</think>### CMSIS Cortex-M3核心外设访问层源文件分析 #### 1. **核心外设寄存器定义** CMSIS Cortex-M3核心外设访问层(Core Peripheral Access Layer, CPAL)通过结构体和宏定义实现了对内核外设寄存器的标准化访问。例如: - **SysTick定时器**的寄存器定义为: ```c typedef struct { __IO uint32_t CTRL; // 控制寄存器 __IO uint32_t LOAD; // 重载值寄存器 __IO uint32_t VAL; // 当前值寄存器 __I uint32_t CALIB; // 校准寄存器 } SysTick_Type; ``` - **NVIC(嵌套向量中断控制器)**的寄存器通过位域定义实现精细控制,例如优先级配置寄存器`IPR`[^1]。 #### 2. **存储器映射基地址宏** CMSIS通过宏定义将外设基地址映射到特定内存区域。例如: ```c #define SCS_BASE (0xE000E000UL) // 系统控制空间基地址 #define SysTick_BASE (SCS_BASE + 0x0010UL) #define SysTick ((SysTick_Type *)SysTick_BASE) // 直接访问结构体指针 ``` 此设计允许通过`SysTick->CTRL`直接操作寄存器。 #### 3. **编译器特定符号定义** CMSIS在`cmsis_compiler.h`中统一处理编译器差异: - **内联汇编**:使用`__ASM`宏适配不同编译器语法: ```c #if defined ( __CC_ARM ) #define __ASM __asm // ARMCC编译器 #elif defined ( __GNUC__ ) #define __ASM __asm__ // GCC编译器 #endif ``` - **中断函数修饰符**:通过`__IRQ`或`__attribute__((interrupt))`声明中断服务函数[^3]。 #### 4. **关键功能函数实现** - **系统初始化**:`SystemInit()`函数配置时钟和FPU,例如启用预取指缓冲: ```c SCB->ACTRL |= SCB_ACTRL_PREFETCH_ENABLE_Msk; ``` - **特权级切换**:通过内联汇编实现: ```c __ASM void __set_CONTROL(uint32_t control) { MSR CONTROL, r0 } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

laixiong_embed

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值