标签: iar

如何在stm32f107芯片上禁用/启用中断?

我有一个ARM stm32f107芯片。我正在将项目从 IAR 移植到 GCC

IAR 提供以下函数来启用和禁用中断:

#define __disable_interrupt() ...
#define __enable_interrupt() ...
Run Code Online (Sandbox Code Playgroud)

如何使用 GCC 启用/禁用我的芯片的中断?

c embedded assembly gcc iar

1
推荐指数
1
解决办法
1万
查看次数

开始在 IAR 中为 stm32l0 编写引导加载程序

在 IAR 中为 stm32l0 添加自定义引导加载程序的适当步骤是什么?以下问题不清楚:

  • 我要创建一个新的 IAR 项目吗?
    • 如果是,我是否像普通项目一样编写引导加载程序,只是更改我的原始 .icf 文件,以便引导加载程序有一个小 ROM 和一个小 RAM 区域?
    • 如果不是,除了 icf 文件和代码之外,我还需要在 IAR proejct 中配置哪些内容?
  • 我还需要考虑哪些其他事情?

我很难开始这个。

所以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 embedded stm32 bootloader iar

1
推荐指数
1
解决办法
2092
查看次数

这是允许在C?

我在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)

这个警告意味着什么?

c syntax iar

0
推荐指数
1
解决办法
483
查看次数

原始c ++内存逻辑的奇怪行为

在带有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)

(请参阅我期望的评论,以及会发生什么.)为什么我得到这个结果?我没有解释.

c++ memory stm32 iar

0
推荐指数
1
解决办法
88
查看次数

将两个消息结构链接在一起

我有两个略有不同的结构,我想以某种方式链接以获得最快的结果.

这是两个结构:

/** 
  * @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 embedded can-bus iar type-punning

0
推荐指数
1
解决办法
73
查看次数

为什么使用指针(低优化)会使程序更快?

我正在学习嵌入式 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),不需要每次都加载并重新加载到寄存器中。在更高级别的优化下,编译器会生成更合理的代码,并且不带指针的代码与带指针的代码一样快。--彩信

c embedded assembly arm iar

0
推荐指数
1
解决办法
1653
查看次数

IAR 与 __bss_end__ 等效的符号

我想知道 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)

linker iar cortex-m

0
推荐指数
1
解决办法
601
查看次数

如何在IAR Workbench Studio中包含头文件?

我已经在 IAR IDE 中创建了组,并且添加了 .h 文件,但仍然显示错误,例如找不到源文件。如何在IAR中添加头文件?

图像

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

c embedded iar

0
推荐指数
1
解决办法
849
查看次数

标签 统计

iar ×8

c ×6

embedded ×5

assembly ×2

stm32 ×2

arm ×1

bootloader ×1

c++ ×1

can-bus ×1

cortex-m ×1

gcc ×1

linker ×1

memory ×1

syntax ×1

type-punning ×1