IAR EWARM __iar_program_start, __iar_data_init3, __iar_copy_init3, __iar_zero_init3

#include <stdint.h>

// The type of a pointer into the init table.
typedef void const * table_ptr_t;

// The type of an initialization routine. It takes a pointer to the start of
// its entry (after the function pointer) in the init table and returns a
// pointer to after its entry.
typedef table_ptr_t init_fun_t( table_ptr_t );

typedef struct
{
  int32_t mOff;
} FAddr;

__no_init uint32_t __iar_SB @ r9;

uint32_t const * __iar_zero_init3( uint32_t const * p )
{
  uint32_t size;
  while ( ( size = *p++ ) != 0 )
  {
    uint32_t d = *p++;
    uint32_t * dest;

    if ( d & 1 )
    {
      d -= 1;
      d += __iar_SB;
    }

    dest = (uint32_t*) d;

    do
    {
      *dest++ = 0;
      size -= 4;
    }while ( size != 0 );
  }
  return p;
}

uint32_t const * __iar_copy_init3( uint32_t const * p )
{
  uint32_t size;
  while ( ( size = *p++ ) != 0 )
  {
    uint32_t const * src;
    uint32_t d;
    uint32_t * dest;

    src = (uint32_t *) ( (char const *) p + *(int32_t *) p );
    p++;

    d = *p++;

    if ( d & 1 )
    {
      d -= 1;
      d += __iar_SB;
    }

    dest = (uint32_t *) d;

    do
    {
      *dest++ = *src++;
      size -= 4;
    }while ( size != 0 );
  }
  return p;
}

#pragma section = "Region$$Table"
void __iar_data_init3( void )
{
  FAddr const * pi = __section_begin("Region$$Table");
  table_ptr_t pe = __section_end ("Region$$Table");
  while ( pi != pe )
  {
    init_fun_t * fun = (init_fun_t *) ( (uint32_t) pi + pi->mOff );
    ++pi;
    pi = fun( pi );
  }
}
Mode_USR  EQU     0x10
Mode_FIQ  EQU     0x11
Mode_IRQ  EQU     0x12
Mode_SVC  EQU     0x13
Mode_ABT  EQU     0x17
Mode_UND  EQU     0x1B
Mode_SYS  EQU     0x1F ; available on ARM Arch 4 and later

I_Bit     EQU     0x80 ; when I bit is set, IRQ is disabled
F_Bit     EQU     0x40 ; when F bit is set, FIQ is disabled

__iar_program_start
          MSR     CPSR_c, #Mode_SYS|F_Bit|I_Bit
          ldr     sp,=SFE(CSTACK)     ; End of CSTACK(user)
          BL      __iar_data_init3
          BL      main
          B       .
时间: 2024-11-06 07:38:38

IAR EWARM __iar_program_start, __iar_data_init3, __iar_copy_init3, __iar_zero_init3的相关文章

IAR EWARM 字体设置

如果只想简单的设置,可进行如下设置 Tools->IDE Options->Editor->Colors and Fonts->Editor Font->Font 但是这里边似乎也没有什么舒服的字体,在网上找了找,还真找到了一个比较不错的字体,现呈现给大家 IAR的 用户配置文件 在这里进行替换即可. winxp 盘符:\Documents and Settings\用户名\Application Data\IAR Embedded Workbench\IarIdePm.in

IAR EWARM 关闭纯汇编函数的警告的方法

/关闭警告 #pragma diag_suppress=Pe940 uint8_t GetMyData(void) { asm(“MOV R0, #0x550F”); } //恢复警告 #pragma diag_warning=Pe940

IAR EWARM PRINTF/SCANF FORMATTER

The linker automatically chooses an appropriate formatter for printf- and scanf-related function based on information from the compiler. If that information is missing or insufficient, for example if printf is used through a function pointer, if the 

IAR在STM32的配置方法

一.在IAR EWARM中建立工程的步骤: 1. 建立工程项目文件 新建一个文件夹来存放整个工程项目,在该项目文件夹下建立几个子文件夹存放不同类别的文件: i. 将官方模板中的stm32f10x_conf.h.stm32f10x_it.c.stm32f10x_it.h和空白main.c文件复制到该项目文件夹下: ii. Obj-存放工程文件,将官方模板中的cortexm3_macro.s.lnkarm_flash.xcl.lnkarm_ram.xcl和stm32f10x_vector.c文件复制

IAR EWAR 内联汇编 调用外部函数 Error[Og005], Error[Og006]

How do I call a C function in another module from inline assembler in IAR EWARM? I have a bit of assembly in a hard fault handler. The assembly is basically meant to pass the current stack pointer as a parameter (in R0). It looks like so... __asm(" m

酒精测试仪检定设备设计与验证

近期,我们开发了一款用于检定各种酒精测试仪的产品,该产品是一种检测设备,用于对警用或者民用就见检测仪进行检定. 1.项目概述 本项目是一套用于酒精检测仪的检定的设备,用于测试酒精检测仪器精确性的检定.如可用于检定呼吸式警用酒精检测仪等.系统要实现温湿度检测.输入输出压力检测.温度控制及高精度温度检测等,因为在测试过程中温度和湿度会对检定的精确性有重要影响.进气分为6路,除了空气和酒精气体外,还有CO和丙酮等干扰性气体,有一套复炸的气体配置方式.同时又有4路气体加热腔室对测试气体进行加热并进行精确

调试器不能连接到STM32的问题与解决办法

很多人都碰到过调试器不能连接到STM32的问题,不管是IAR的J-Link还是Keil的ULink,或者是ST的ST-Link.出现这个问题时,调试软件会提示不能建立与Cortex-M3的连接,或提示不能下载程序,或提示找不到要调试的设备等.       这样的问题都是发生在调试那些可以在CPU不干预的时候自动运行的模块.或在调试低功耗模式的程序的时候.所谓“可以在CPU不干预的时候自动运行的模块”包括:DMA.定时器.连续转换模式下的ADC.看门狗等模块. ------------------

关于 while(1)和for(;;)效率问题的一点想法

这几天看到好友的文章关于while(1)和for(;;)效率的讨论,手痒说了两句.回头一寻思,自己也仅仅是判断.没有做不论什么实验,我们就看看这两种写法究竟有什么差别: 实验环境:IAR EWARM 5.2 我就随便在一个嵌入式项目上做文章了,首先projectC语言编译优化选择了None, 输出选择带汇编输出,输出的汇编文件和C语言相应上. 我在main函数里先用for(;;)写了个死循环,我们看看编译结果: 注意main.c生成了一个相应的main.s 能够看到,是用一条跳转指令直接替代的f

STM32库函数编程

catalogue 1. 基于标准外设库的软件开发 2. 基于固件库实现串口输出(发送)程序 3. 红外接收实验 1. 基于标准外设库的软件开发 0x1: STM32标准外设库概述 STM32标准外设库之前的版本也称固件函数库或简称固件库(即操作片外固件的代码集合),是一个固件函数包,它由程序.数据结构和宏组成,包括了微控制器所有外设的性能特征.该函数库还包括每一个外设的驱动描述和应用实例,为开发者访问底层硬件提供了一个中间API,通过使用固件函数库,无需深入掌握底层硬件细节,开发者就可以轻松应