VSCode转向_WIN32的定义
我在VisualStudio代码中有一个嵌入式项目,在大多数情况下,效果很好.我的问题是始终定义某种方式_WIN32,这导致错误包括某些标头文件. 我猜这个问题是一个智能问题,因为该项目没有任何错误(我使用IAR编译器).只是Intellisense的错误散发出显示错误. (例如,在一个标头文件中,它试图打开,因为_WIN32定义了,显然会在带有嵌入式编译器的嵌入式项目中失败,因此Intellisense报告说它无法打开标题文件) 现在,我到目前为止尝试的是: 更改IntelliSense模式,但是即使我将其切换到ARM的GCC或Clang,_WIN32仍定义 尝试删除_WIN32从代码定义,但是VSCODE似乎在内部定义了它(如果有道理的话?). 我看着线程他们试图回答_WIN32定义的问题的位置.但这也没有帮助我. 有人知道为什么定义_WIN32或在其中定义 ?如何将VisualStudio代码/Intellisense告诉不定义_WIN32? 预先感谢.
8 2023-11-25
编程技术问答社区
在结构中使用类型化枚举,避免类型混合警告
我正在与C99合作.我的编译器是IAR嵌入式工作台,但我认为这个问题也对其他编译器也有效. 我有一个带有几个项目的Typedef枚举,我在该新类型的结构中添加了一个元素 typedef enum { foo1, foo2 } foo_t; typedef struct { foo_t my_foo; ... } bar_t; 现在,我想创建一个BAR_T的实例,然后将其所有内存初始化为0. bar_t bar = { 0u }; 这会产生警告,即我将枚举的一种与另一种类型混合在一起. IR特定的警告号为PE188.它的编译和工作正常,因为枚举在一天结束时是未签名的INT.但是我想避免一千个naggy警告.什么是初始化在其中列举类型为0的结构类型的干净方法? 为了参数,假设Bar_t有很多成员 - 我只想将它们全部设置为0.我宁愿不输入类似的内容: bar_t bar = { foo1, 0u, some_symbol
0 2023-10-30
编程技术问答社区
IAR为自定义数据定义内存区域
我想在STM32微观中定义特定的内存区域,以存储一些字符串.我正在使用IAR编译器,但我没有找到一个简单的示例,可以帮助我使用ICF文件以正确的方式创建该区域.如何在代码中创建区域并使用此区域?谢谢 解决方案 我找到了这个解决方案: 在ICF文件中,我以这种方式定义了内存区域: define region LANGUAGE_region = mem:[from 0x080FB000 to 0x080FC000]; "LANGUAGE_PLACE":place at start of LANGUAGE_region { section .LANGUAGE_PLACE.noinit }; 我将使用程序员使用外部SREC文件填充此区域. 要使用简单程序(使用整数)测试该区域,我使用此声明: 在标题中: extern const unsigned int mydata @".LANGUAGE_PLACE.noinit"; 在C文件中: cons
6 2023-09-30
编程技术问答社区
像STM8一样对STM32进行编程(寄存器级GPIO)
i编程的stm8 gpio喜欢PD_ODR_ODR4 = 1;,但是stm32f10x.h没有此功能.有没有.h文件的定义? 对不起,但是我不知道如何更好地解释这个问题. 我尝试了多个GPIO库. 解决方案 您在问题中提到stm32f10x.h,所以我假设这与STM32F1系列控制器有关.其他系列有一些差异,但是一般过程是相同的. gpio引脚在16个端口的银行中排列,每个端口都有其自己的控制寄存器集,名为GPIOA,GPIOB等.它们被定义为指向GPIO_TypeDef结构的指针.有3个影响引脚输出的控制寄存器. 写作 ODR 一次设置所有16个引脚,例如GPIOB->ODR = 0xF00F通过B0通过B0和B12通过B15将销钉设置为1,而B4到0,无论其先前状态如何,一个人可以写GPIOD->ODR |= (1ODR &= ~(1
44 2023-09-30
编程技术问答社区
对(有符号的)枚举值进行位操作
我正在使用标志的枚举值: typedef enum { a = 0x00, b = 0x01u, // the u has no influence, as expected c = 0x02u, // the u has no influence, as expected ... } enum_name; volatile unsigned char* reg = SomeAddress; *reg |= b; 根据Misra-C:2004的签名类型,不得进行2004位操作.不幸的是,我的编译器IAR使用签名 int(或简短或char)作为基本的枚举类型,而我可以找到的唯一选择与尺寸有关,而不是签名(" - enum-is--) int"). 解决方案 根据特别是,您应该定义一个额外的"前哨"值,以确保编译器选择正确的类型.它更喜欢签名类型,并且使用最小的整数类型,因此前哨应该是相应的无符号整数类型可以描述的最大正整数.例如, type
2 2023-09-29
编程技术问答社区
IAR项目变量,例如$ proj_dir $
IAR中是否有可能添加其他项目变量,例如$PROJ_DIR$指定我的项目环境? 我喜欢保持我的项目便携式和适应性. 解决方案 当然有手册: 变量/描述 $ config_name $当前构建配置的名称,例如调试或发布. $ cur_dir $当前目录 $ cur_line $当前行 $ date $今天的日期 $ ew_dir $ IAR嵌入式工作台的顶部目录,例如C:\ Program Files \ IAR Systems \ Iar Systems \ Embedded WorkBench 6.N $ exe_dir $目录的可执行输出目录 $ file_bname $ fileName不扩展名 $ file_bpath $完整路径没有扩展 $ file_dir $活动文件目录,无文件名 $ file_fname $没有路径的活动文件文件名 $ file_path $活动文件的完整路径(在编辑,项目或消息窗口中) $ list_dir
18 2023-08-31
编程技术问答社区
通过应用程序访问链接器脚本中定义的符号
在我的链接脚本文件中,我定义了两个符号 define symbol _region_RAM_start__ = 0xC0000000; define symbol _region_RAM_end__ = 0xC00fffff; ,然后我已经导出了它们,如下所示 export symbol _region_RAM_start__; export symbol _region_RAM_end__; 从应用程序代码中,我尝试访问这些符号 extern const unsigned int _region_RAM_start__; extern const unsigned int _region_RAM_end__; .... int GetRAMSize() { int size = 0; unsigned int address_1 = _region_RAM_start__; unsigned int address
6 2023-06-19
编程技术问答社区
C-功能的记忆位置
我希望创建一个软件,在该软件中,可以在以后在我的微控制器上对某些功能(或块)进行编程,而无需重新刷新整个软件(Flash将通过通信接口(例如SPI)完成.新块将具有相同的API(例如5个字节与参数,1个字节返回). 记忆体系结构将如下图所示组织: 内存架构 总而言之,FBL和APPL块将仅在MCU上进行1次编程.在此过程的稍后,我希望有可能在创建的块中编程或更改某些功能(块1,块2 ...) 对于每个块,我有: flash的2个部分(一个用于初始化功能,一个用于"任务"函数). RAM的1部分,我可以放置静态变量. 当前,我的问题是,我无法使用其中的所有内容创建一个单个内存块.例如,如果我想在新块中使用Math.h的函数,则链接器将将Math.h函数放置在我的应用扇区中,而不是在专用于该块的分配内存扇区中.但是正如我所说,我的应用程序部门不应该更改,因为它将仅编程1次.所以我想知道如何写一些"独立"块... 非常感谢! 解决方案 您必须确保至
26 2023-03-25
编程技术问答社区
如何强迫IAR使用所需的Cortex-M0+指令(优化功能将被禁用)。
我需要强制IAR TP在我的代码的某些部分中使用某些Cortex-M0+指令,同时用C. 代码 请不要提供纯ASM函数或内联ASM等. 我设法做到了51条指令,但不能. ADR,BLX,RSB,SBCS,SXTH指令. 对此功能禁用优化(#pragma优化= none) 我通过考虑指导行为尝试了很多事情. 但是IAR更喜欢使用不同的指令. 其他人以前是在这样不必要的事情上挣扎还是有任何想法? 解决方案 请不要提供纯ASM函数或内联ASM等. ,但是这些是您问题的唯一解决方案,不取决于编译器版本. 您可能有 设法为51个说明做到了这一点 ..但是,即使在Optimizer de Optimizer关闭的情况下,也可以对如何为C代码生成指令的下一个(主要)编译器版本可能会大大不同. btdt for GCC. 用汇编语言编码内容直接消除了该编译器版本的依赖性.您甚至应该有一些示例代码,因为大多数C启动(重置处理程序)代码作
34 2023-03-23
编程技术问答社区
嵌入式C语言:寄存器访问
假设我们要在地址上写0xc000,我们可以在C中定义一个宏为: #define LCDCW1_ADDR 0xc000 #define READ_LCDCW1() (*(volatile uint32_t *)LCDCW1_ADDR) #define WRITE_LCDCW1(val) ((*(volatile uint32_t *)LCDCW1_ADDR) = (val)) 我的问题是,使用任何微控制器时,请考虑一个示例MSP430,P1OUT寄存器地址为0x0021. 但是,当我们使用p1out = 0xffff;//它分配了p1out值0xffff. 我的问题是如何写入该地址,例如在这种情况下,0x0021. IDE是IAR.我在标题MSP430G25533中找到了定义: #define P1OUT_ (0x0021u) /* Port 1 Output */ DEFC( P1OUT
74 2023-03-23
编程技术问答社区
命令提示符错误 'C:\Program'未被识别为内部或外部命令、可操作程序或批处理文件
我正在尝试运行以下批处理命令.该命令已从IDE中提取,因此已确认工作.获取下面提到的错误. 我尝试了一些双引号的变体,但它们没有起作用. 即使在powershell上也有相同的信息. C:\Program Files\IAR Systems\Embedded Workbench 7.0\430\bin\icc430.exe F:\CP001\source\Meter\Main.c -D Hardware_P20E -D Calibration_code -D _Optical -D _Configuration_TS0382 -o F:\CP001\Temp\C20EO\Obj\ --no_cse --no_unroll --no_inline --no_code_motion --no_tbaa --debug -D__MSP430F425 -e --double=32 --dlib_config C:\Program Files\IAR Systems\Embedded
48 2023-03-21
编程技术问答社区
如何在CMake中指定一个编译器?
我想使用IAR编译器.我注意到Cmake已经有很多有关此编译器的文件: blob/master/modules/compiler/iar.cmake 我阅读的常见解决方案是在我的CMakeLists.txt中手动指定所有工具链: set(CMAKE_C_COMPILER iccarm) set(CMAKE_CPP_COMPILER iccarm) cmake如何将这些定义与`模块/编译器/iar.cmake'? 链接 我以为我只需要做 include("Modules/Compiler/IAR.cmake") 指定我的IAR编译器的正确方法是什么? 当我做 时 cmake . 它仍然尝试使用gcc而不是我的IAR编译器.为什么? 解决方案 要选择一个特定的编译器,您有多种解决方案,如 cmake wiki : 方法1:使用环境变量 对于C和C ++,设置CC和CXX环境变量.该方法不能保证适用于所有发电机. (具体来说
400 2023-03-15
编程技术问答社区
不能用IAR ARM编译器将函数表强制到特定地址
我有一个函数表类型,如 typedef struct { uint16_t majorRevision; uint16_t minorRevision; uint8_t (*CommInit)(void *); uint8_t (*CommDeInit)(void); uint16_t (*Write)(uint8_t *, uint16_t); uint16_t (*Read)(uint8_t *, uint16_t); uint8_t (*Attached)(void); uint8_t (*ExitApp)(uint8_t); uint8_t (*Jump)(uint32_t address); uint16_t (*GetCRC)(uint8_t*, uint32_t); int (*Encrypt)(uint8_t *, uint32_t); int
112 2023-03-05
编程技术问答社区
用一个编译器创建的静态c库是否与另一个编译器兼容?
就我而言,我有一个库,该库构建了Code Sourcery GCC定位ARM Cortex-M4.然后,我试图将该库链接到与IAR编译器一起编译的项目中. 是否可以这样做,或者必须使用新工具重建库?哪些因素会影响这? 解决方案 静态库是几个始终特定编译器的对象文件的捆绑包.因此,如果您尝试将基于gcc的lib链接到IAR编译器,则由于要链接的对象文件格式之间的不匹配,您将在编译时间中获得错误. 您需要使用IAR来重建库. 其他解决方案 ARM的IAR编译器支持AEABI格式,该格式允许您使用一个编译器编译文件并与另一个编译器链接. 如果您使用GCC构建了库并启用了AEABE,则应该使用IAR工具在项目构建中使用静态库.
8 2023-03-05
编程技术问答社区
将外部静态库的片段放置到特定位置
我的应用程序调用一些放置在外部静态库中的功能.我将外部静态库链接到我的应用程序,并且一切都起作用(在这种情况下,我正在使用GCC). 然而,链接器选择了文本,.data和.bss部分的文本的位置(地址).我可以通过修改链接脚本来选择/更改其位置,但是由于我必须指定库的所有功能,变量等,这很乏味.我的意思是: . = 0x1000; /* new location */ KEEP(*(.text.library_function1)); KEEP(*(.text.library_function2)); [...] 另一种解决方案是通过为每个函数/变量放置A e节属性来构建外部库,然后通过重新定位整个部分来修改链接器.类似: /* C source file */ unsigned char __attribute__((section (".myLibrarySection"))) variable1[10]; unsigned char __attribute__
130 2023-03-05
编程技术问答社区
有人为MSP430的IAR Embedded Workbench实现了__getzone()吗?
我必须在应用程序中处理一些时间转换.我想尽可能坚持使用标准库功能.现在,我使用time_t结构作为我的系统时间群.但是,某些设备可以将时间同步到我的设备,并且可能是UTC也可能不是UTC.另外,我的设备将同步到另一个设备,并且该时间将始终是UTC. 无论如何,我可以询问用户在与设备同步的时间区域的时区是什么以及他们是否使用DST.当我的设备获得时间同步时,我可以使用MKTime直接生成我的时间戳(我的设备系统时间需要匹配它们同步以进行时间冲压的时间,否则我必须经常进行转换),然后从中我可以如果我知道我的时间同步来自非UTC源,请使用GMTime()获取UTC时间.默认情况下,麻烦是localtime()和gmtime()将返回相同的值,因为库默认情况下将删除它是在直接的UTC时间中,并且没有DST或TIMEZONE OFFSET. 因此,我认为处理此问题的方法是实现和覆盖库__getzone函数. 从ew430_compilerreference的第106页 要使
88 2023-03-03
编程技术问答社区
我怎样才能在IAR Embbedded Workbench中编译两个版本的代码?
我有两个版本的代码,我需要切换它们,因为工作需要编译每个代码,同时将两个版本保留在IR级别项目上.我发现类似"编译开关"之类的东西,但我不知道它在做什么.有没有人告诉我一个关键字或可以搜索的建议? 解决方案 您可以使用C预处理器#Define功能在代码版本之间切换并使用IAR EWARM Project的定义的符号功能在特定标头文件中启用#Defines列表(例如::::定义.H)将包含在所有C文件中. defines.h #if defined(PROD_VERSION) #define SOFTWARE_VERSION_PRODUCT ("1.0-release") //...whetever specific #defines meant for the release version, for example... //#define ENABLE_RF_STUB #define USE_SERIAL_CTS_RTS #el
48 2023-02-04
编程技术问答社区
LDR Rd,-Label与LDR Rd,[PC+Offset]对比
我是IAR和嵌入式编程的新手.我正在调试以下C代码,发现R0可以按住counter1到??main_0的地址,而R1可以按住counter2的地址至[PC,#0x20].这是完全可以理解的,但是我无法明白为什么它被分配给R0使用LDR Rd, -label而R1使用LDR Rd, [PC+Offset],两种方法之间有什么区别? 我只在搜索后才知道字面池,但没有回答我的问题.另外,??main_0首先定义了哪里? int counter1=1; int counter2=1; int main() { int *ptr; int *ptr2; ptr=&counter1; ptr2=&counter2; ++(*ptr); ++(*ptr2); ++counter2; return 0; } 解决方案 ??main_0不是"定义"的,它只是此处使用的地址的自动生成标签指针.实际上,将另一个反向指针作
54 2023-02-04
编程技术问答社区
IAR Embedded Workbench:stdarg.h未被预处理
我正在使用 iar嵌入式工作台7.40 . 构建C语言应用程序 我正在使用 libclang 获得我的C代码的 ast (抽象语法树)表示. 为此,我正在预处理我的源代码. 问题在于#include - 它不会扩展. 原始代码段: int before_stdarg = 1; #include int after_stdarg = 2; va_list args; #include "func1.h" ... 预处理代码段: #line 1 "source\\App\\func1.c" int before_stdarg = 1; #include int after_stdarg = 2; va_list args; #line 1 "C:\\testAppC\\source\\App\\func1.h" ... 查看stdarg.h: #ifdef __ICCARM__ #error
24 2023-02-04
编程技术问答社区