我有一个ARM stm32f107芯片。我正在将项目从 IAR 移植到 GCC
IAR 提供以下函数来启用和禁用中断:
#define __disable_interrupt() ...
#define __enable_interrupt() ...
Run Code Online (Sandbox Code Playgroud)
如何使用 GCC 启用/禁用我的芯片的中断?
在 IAR 中为 stm32l0 添加自定义引导加载程序的适当步骤是什么?以下问题不清楚:
我很难开始这个。
所以icf将用于主要项目:
__region_ROM_start__ = 0x08000000;
__region_ROM_end__ = 0x08008FFF;
Run Code Online (Sandbox Code Playgroud)
所以 icf 将用于引导加载程序项目:
__region_Bootloader_ROM_start__ = 0x08009000;
__region_Bootloader_ROM_end__ = 0x08009FFF;
Run Code Online (Sandbox Code Playgroud)
和关于0xFFRAM的同样的事情?
我在C中写了以下这一行.我想知道该语言是否支持.它是这样的:
char * mode[7] = Config_Msg.DHCP ? "DHCP" : "Static";
Run Code Online (Sandbox Code Playgroud)
基本上我想在模式中插入"DHCP"或"STATIC"的字符串值,取决于Config_Msg.DHCP中的值.
当我在IAR中编译时,我收到此警告:
Warning[Pe520]: initialization with "{...}" expected for aggregate
Run Code Online (Sandbox Code Playgroud)
这个警告意味着什么?
在带有stm32(arm cortex)CPU的IAR IDE中,我在原始情况下有非常奇怪的行为.
uint32_t s = 6654; //=0x000019FE
//next I'll see in IAR debugger
uint8_t res1 = 0;
res1 = (s&0xFF000000)>>24; //see in debugger: res1=00
res1 = (s&0x00FF0000)>>16; //res1=00
res1 = (s&0x0000FF00)>>8; //res1=19
res1 = (s&0x000000FF); //res1=FE
void *sp = &s;
uint8_t res2 = 0;
res2 = *((uint8_t*)sp+0); //res2=FE but must be 00!
res2 = *((uint8_t*)sp+1); //res2=19 but must be 00!
res2 = *((uint8_t*)sp+2); //res2=00 but must be 19!
res2 = *((uint8_t*)sp+3); //res2=00 but must be FE!
Run Code Online (Sandbox Code Playgroud)
(请参阅我期望的评论,以及会发生什么.)为什么我得到这个结果?我没有解释.
我有两个略有不同的结构,我想以某种方式链接以获得最快的结果.
这是两个结构:
/**
* @brief CAN Tx message structure definition
*/
typedef struct
{
uint32_t StdId; /*!< Specifies the standard identifier.
This parameter must be a number between Min_Data = 0 and Max_Data = 0x7FF */
uint32_t ExtId; /*!< Specifies the extended identifier.
This parameter must be a number between Min_Data = 0 and Max_Data = 0x1FFFFFFF */
uint32_t IDE; /*!< Specifies the type of identifier for the message that will be transmitted.
This parameter can be a value of …Run Code Online (Sandbox Code Playgroud) 我正在学习嵌入式 C 编程教程,然后意识到使用指针指向变量,然后使用它来取消引用可以使程序更快!
我有汇编的基本知识,但我不明白为什么将变量的地址分配给指针会更快,我们不是在谈论按引用或按指针或按值传递!
据我所知,
R0,就像带有指针的代码中发生的情况一样。p_int寄存器的别名R0,这如何帮助使程序更快?不使用指针的代码:
int counter = 0;
int main() {
while (counter < 6) {
++(counter);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
相反,下面是带有指针的代码:
int counter = 0;
int main() {
int *p;
p = &counter;
while (*p < 6) {
++(*p);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我联系了课程创建者,他很友善地为我重播并分解了它,为了帮助其他可能遇到同样问题的人,我将留下问题和答案
为了访问内存中的变量,CPU 需要该变量在寄存器之一中的地址。在最低级别的代码优化中,编译器在每次访问变量之前从代码存储器加载该地址。指针加快了速度,因为作为 main() 函数内的局部变量被分配到寄存器。这意味着该地址位于寄存器中(在本例中为 R0),不需要每次都加载并重新加载到寄存器中。在更高级别的优化下,编译器会生成更合理的代码,并且不带指针的代码与带指针的代码一样快。--彩信
我想知道 Cortex-M RAM 中的静态数据的末尾在哪里。GCC CMSIS 链接器脚本提供了一个符号__bss_end__,我只需获取它的地址。有 IAR 等效项吗?或者我是否必须使用单个变量创建一个虚拟部分并将其放在后面readwrite?
这是我的(非常标准的)IAR 链接器脚本:
/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x00000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x00000000;
define symbol __ICFEDIT_region_ROM_end__ = (0x00000000+0x00010000-1);
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__ = (0x20000000+0x00002000-1);
/*-Sizes-*/
if ( !isdefinedsymbol( __ICFEDIT_size_cstack__ ) )
{ define symbol __ICFEDIT_size_cstack__ = 0x400; }
if ( !isdefinedsymbol( __ICFEDIT_size_heap__ ) )
{ define symbol …Run Code Online (Sandbox Code Playgroud) 我已经在 IAR IDE 中创建了组,并且添加了 .h 文件,但仍然显示错误,例如找不到源文件。如何在IAR中添加头文件?

我还尝试在预处理器中添加路径为 $PROJ_DIR$/hdr。但我仍然遇到同样的错误。