MDK中armclang编译器
来源:互联网 发布:华为云计算大会 编辑:程序博客网 时间:2024/06/05 01:19
MDK以及DS5等工具中主推的编译器已经更换为armclang编译器。而原来的armcc编译器已经不再更新,只是提供一些更新,所以我就对armclang进行了一些测试。
测试的芯片是STM32,使用ST公司最新推出的Cube HAL库。直接新建一个工程之后,直接将编译器更改为armclang编译不通过。
错误一:提供找不到‘__weak’
解决方案:"__weak"的定义是在stm32f1xx_hal_def.h文件中。其中有关于各种编译器的定义部分。理论上armclang应该是会定义__GNU__的,可能由于MDK的bug或是其它原因,这部分并没有定义,所以需要手动增加针对armclang编译器的定义。
修改后代码如下:
/** ****************************************************************************** * @file stm32f1xx_hal_def.h * @author MCD Application Team * @version V1.1.1 * @date 12-May-2017 * @brief This file contains HAL common defines, enumeration, macros and * structures definitions. ****************************************************************************** * @attention * * <h2><center>© COPYRIGHT(c) 2017 STMicroelectronics</center></h2> * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. Neither the name of STMicroelectronics nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** *//********************************************************************************* @author WangWei * @date 29-Sep-2017* @brief Add some code for CLANG *******************************************************************************//* Define to prevent recursive inclusion -------------------------------------*/#ifndef __STM32F1xx_HAL_DEF#define __STM32F1xx_HAL_DEF#ifdef __cplusplus extern "C" {#endif/* Includes ------------------------------------------------------------------*/#include "stm32f1xx.h"#if defined(USE_HAL_LEGACY)#include "Legacy/stm32_hal_legacy.h"#endif#include <stdio.h>/* Exported types ------------------------------------------------------------*//** * @brief HAL Status structures definition */ typedef enum { HAL_OK = 0x00U, HAL_ERROR = 0x01U, HAL_BUSY = 0x02U, HAL_TIMEOUT = 0x03U} HAL_StatusTypeDef;/** * @brief HAL Lock structures definition */typedef enum { HAL_UNLOCKED = 0x00U, HAL_LOCKED = 0x01U } HAL_LockTypeDef;/* Exported macro ------------------------------------------------------------*/#define HAL_MAX_DELAY 0xFFFFFFFFU#define HAL_IS_BIT_SET(REG, BIT) (((REG) & (BIT)) != RESET)#define HAL_IS_BIT_CLR(REG, BIT) (((REG) & (BIT)) == RESET)#define __HAL_LINKDMA(__HANDLE__, __PPP_DMA_FIELD__, __DMA_HANDLE__) \ do{ \ (__HANDLE__)->__PPP_DMA_FIELD__ = &(__DMA_HANDLE__); \ (__DMA_HANDLE__).Parent = (__HANDLE__); \ } while(0U)#define UNUSED(x) ((void)(x))/** @brief Reset the Handle's State field. * @param __HANDLE__: specifies the Peripheral Handle. * @note This macro can be used for the following purpose: * - When the Handle is declared as local variable; before passing it as parameter * to HAL_PPP_Init() for the first time, it is mandatory to use this macro * to set to 0 the Handle's "State" field. * Otherwise, "State" field may have any random value and the first time the function * HAL_PPP_Init() is called, the low level hardware initialization will be missed * (i.e. HAL_PPP_MspInit() will not be executed). * - When there is a need to reconfigure the low level hardware: instead of calling * HAL_PPP_DeInit() then HAL_PPP_Init(), user can make a call to this macro then HAL_PPP_Init(). * In this later function, when the Handle's "State" field is set to 0, it will execute the function * HAL_PPP_MspInit() which will reconfigure the low level hardware. * @retval None */#define __HAL_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = 0U)#if (USE_RTOS == 1U) /* Reserved for future use */ #error "USE_RTOS should be 0 in the current HAL release"#else #define __HAL_LOCK(__HANDLE__) \ do{ \ if((__HANDLE__)->Lock == HAL_LOCKED) \ { \ return HAL_BUSY; \ } \ else \ { \ (__HANDLE__)->Lock = HAL_LOCKED; \ } \ }while (0U) #define __HAL_UNLOCK(__HANDLE__) \ do{ \ (__HANDLE__)->Lock = HAL_UNLOCKED; \ }while (0U)#endif /* USE_RTOS */#if defined ( __GNUC__ ) || defined ( __clang__ ) #ifndef __weak #define __weak __attribute__((weak)) #endif /* __weak */ #ifndef __packed #define __packed __attribute__((__packed__)) #endif /* __packed */#endif /* __GNUC__ *//* Macro to get variable aligned on 4-bytes, for __ICCARM__ the directive "#pragma data_alignment=4" must be used instead */#if defined (__GNUC__) || defined (__clang__) /* GNU Compiler */ #ifndef __ALIGN_END #define __ALIGN_END __attribute__ ((aligned (4))) #endif /* __ALIGN_END */ #ifndef __ALIGN_BEGIN #define __ALIGN_BEGIN #endif /* __ALIGN_BEGIN */#else #ifndef __ALIGN_END #define __ALIGN_END #endif /* __ALIGN_END */ #ifndef __ALIGN_BEGIN #if defined (__CC_ARM) /* ARM Compiler */ #define __ALIGN_BEGIN __align(4) #elif defined (__ICCARM__) /* IAR Compiler */ #define __ALIGN_BEGIN #endif /* __CC_ARM */ #endif /* __ALIGN_BEGIN */#endif /* __GNUC__ *//** * @brief __RAM_FUNC definition */ #if defined ( __CC_ARM )/* ARM Compiler ------------ RAM functions are defined using the toolchain options. Functions that are executed in RAM should reside in a separate source module. Using the 'Options for File' dialog you can simply change the 'Code / Const' area of a module to a memory space in physical RAM. Available memory areas are declared in the 'Target' tab of the 'Options for Target' dialog. */#define __RAM_FUNC HAL_StatusTypeDef #elif defined ( __ICCARM__ )/* ICCARM Compiler --------------- RAM functions are defined using a specific toolchain keyword "__ramfunc". */#define __RAM_FUNC __ramfunc HAL_StatusTypeDef#elif defined ( __GNUC__ ) || defined ( __clang__ )/* GNU Compiler ------------ RAM functions are defined using a specific toolchain attribute "__attribute__((section(".RamFunc")))".*/#define __RAM_FUNC HAL_StatusTypeDef __attribute__((section(".RamFunc")))#endif/** * @brief __NOINLINE definition */ #if defined ( __CC_ARM ) || defined ( __GNUC__ ) || defined ( __clang__ )/* ARM & GNUCompiler ---------------- */#define __NOINLINE __attribute__ ( (noinline) )#elif defined ( __ICCARM__ )/* ICCARM Compiler ---------------*/#define __NOINLINE _Pragma("optimize = no_inline")#endif#ifdef __cplusplus}#endif#endif /* ___STM32F1xx_HAL_DEF *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
错误二:嵌入式汇编部分报错
这个是由于armclang嵌入汇编基本和GNU C类似,不同于armcc编译器,所以这部分需要修改。但是我觉得这是很好的地方,因为这样以后学习STM32的朋友可以更容易的学习linux。
阅读全文
0 0
- MDK中armclang编译器
- MDK编译器优化相关
- Keil MDK编译器内存分配
- Keil MDK编译器的数据类型定义
- keil MDK编译器警告和错误详解
- Keil MDK编译器的数据类型定义
- Keil MDK编译器的数据类型定义
- Keil MDK编译器的数据类型定义
- MDK Keil编译器编译窗口的设置
- MDK-ARM编译器V6和V5
- keil MDK编译器警告和错误详解
- MDK Keil编译器编译窗口的设置
- MDK中 use microlib
- MDK中一些疑惑
- keil MDK编译器警告和错误详解(不定期更新)
- keil MDK编译器(V4.01)与H-JTAG的问题
- Keil MDK编译器(V4.03)与J-LINK使用
- 转:Keil MDK编译器与J-LINK使用
- C语言中关于 LINK : fatal error LNK1561: 必须定义入口点 的解决方法
- 递归-放苹果问题
- hdu1950二分法的LISS
- 苹果Face ID到底安不安全?苹果白皮书给出解释!
- SQL语句之约束
- MDK中armclang编译器
- Java中Iterable和Iterator的辨析
- iconlover中文绿色版V5.46下载 |Icon图标制作工具 | iconlover 注册码
- 聊一聊麦克风阵列技术:语音交互应该选用怎样的方案?|深度
- SQL语句之分页
- 成功人士的9个理财好习惯
- 单链表的实现
- 刺杀
- Learning Python Part I 之动态类型