标签存档: IAR

IAR中使用堆和栈的问题——Working with the Stack and Heap

英文版PDF地址: http://www.iar.com/Global/Resources/Seminars/Working_with_the_Stack_and_Heap.pdf

——————————————  以下为我翻译的  ——————————————————–

议题
heap(堆)是什么?

怎样决定堆的大小
使用堆时潜在的问题
堆分配注意事项
使用栈(Stack)
决定栈的大小
使用栈时的潜在问题
静态栈检查
Embedded Workbench中的栈插件工具
示例
继续阅读 »

Python笔记–IAR使用Python脚本实现自动对烧录文件进行处理

这篇文章将要记录如何配置IAR调用外部工具实现对编译完成后自动对生成的hex文件进行合并、对bin文件进行额外操作。

问题背景:
我们目前的项目在STM32平台上开发,具备远程无线升级功能,即通过GPRS网络实现远程IAP,IAP过程中使用的是bin文件(因为bin文件不包含地址,处理比较简单)。因此,在项目编译后我们就需要两个文件,一个是设备出厂时的烧录文件,该文件为hex格式,一个是设备部署后远程升级时用的bin文件。而出厂hex文件又由两个文件合并而成,分别是BOOT.hex: 用户启动代码,用于引导和远程升级,由BOOT工程编译得到;APP.hex :用户应用代码,由APP工程编译得到。同时,APP.bin: 用户应用代码二进制格式,通过APP工程编译得到。
所以每次重新编译app工程或者boot工程后都要进行一次复制粘贴,而且IAR链接时只能生成一种文件,hex或者bin,选择生成hex时就会删除bin,选择bin又会删除hex。因此要得到这两个文件需要编译连接两次。
另外,升级时我们需要知道bin文件的大小,CRC32校验码,烧录的起始地址,为了操作方便一个比较好的办法是将这三个信息都放到bin文件内部,所以编译生成bin文件后也要对该文件进行处理。
为了简化人工操作,减少出错几率,我就动手编写了一个脚本,每次编译连接完成后自动将APP.hex转为APP.bin,并且将APP.hex和BOOT.hex进行合并。

继续阅读 »

Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement

Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement EW targets: All EW component: C/C++ compiler Keywords: C code, keywords, SFR, UART Last update: January 14, 2009 Background The warning [Pa082] is issued if 2 (or more) of the variables in a C-statment are volatile. The message text “…order of volatile accesses is undefined…” is the central information, i.e. the compiler (following the ANSII standard) can access the variables in an order that is not defined. Is this a problem , or not… …well that depends on your application. Volatile is (typically) used for variables that are accessed from several threads in the application, and for Special Function Register that are the connection in/out of the chip. So you must study the volatile variables that are present in this C-statement and from the usage of these volatile variables decide if you must make a change or not. How to change The change is to break up the C-statement, so that each new C-statement holds only one access to a volatile variable. In this small example the variables internalChannelSelect and ADC are volatile. If so the following C-source will issue the “Warning[Pa082]”. intAnalogSample[internalChannelSelect] = ADC[internalChannelSelect] ; Then the following change will make the C-source predictable. i = internalChannelSelect; k = ADC; intAnalogSample = k;

IAR工程管理 使用Define symbols定义表示数字常量的宏

想要定义一个类似于 #define HSE_VALUE ((uint32_t)16000000 效果的宏。

目的:

**
 * @brief In the following line adjust the value of External High Speed oscillator (HSE)
   used in your application 

   Tip: To avoid modifying this file each time you need to use different HSE, you
        can define the HSE value in your toolchain compiler preprocessor.
  */           
#if !defined  HSE_VALUE
 #ifdef STM32F10X_CL   
  #define HSE_VALUE    ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
 #else 
  #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
 #endif /* STM32F10X_CL */
#endif /* HSE_VALUE */

在Define symbols 框中输入HSE_VALUE=((uint32_t)8000000)即可,注意等号两边不能有空格!

IAR包含文件路径的方法小结

1) 在定义包含文件路径的文本框中,定义包含文件的路径有两种很重要的语法:
一是$TOOLKIT_DIR$,这个语法表示包含文件的路径在IAR安装路径的8051文件夹下,也就是说如果IAR安装在C盘中,哪么它就表示C:\Program Files\IAR Systems\Embedded Workbench 4.05 Evaluation version\8051这个路径。
二是$PROJ_DIR$,这个语法表示包含文件的路径在工程文件中,也就是和eww文件和ewp文件相同的目录。我们刚此建立 的 project 项 目 中 , 如果使用了这个语言,哪么就表示现在这个文件指向了C:\Documents and Settings\Administrator\桌面\project这个文件夹。

和这两个语法配合使用的还有两个很重要的符号,这就是“\..”和“\文件夹名”。
\..:表示返回上一级文件夹
\文件夹名:表示进入名为“文件夹名”的文件夹。
我们来具体看两个例子:
$TOOLKIT_DIR$\inc\ : 这 句 话 的 意 思 是 包 含 文 件 指 向 C:\Program Files\IAR Systems\Embedded Workbench 4.05 valuation version\8051\inc。
$PROJ_DIR$\..\Source:这句话的意思是包含文件指向工程目录的上一级目录中的Source文件夹中。例如:假设我们的工程放在:\project\IAR中,哪么$PROJ_DIR$\..\就 将路径指向了D:\project中,再执行\Source,就表示将路径指向了D:\project\Source中。

EW430代码优化小结

一边使用一边总结,先写下现在遇到的几个问题。

IAR默认的优化等级为low,如果使用Medium等级,则涉及到一下地方的代码不能使用该等级的优化:
1.涉及到InfoFlash读写操作的地方。
2.涉及到结构体读写操作的地方。

对个别函数使用不同的优化规则的方法:
#pragma optimize = low

有遇到新的问题再更新、总结。

使用SourceInsight和IAR workbench从现有工程快速创建新工程的方法

也许大家都有这样的感受,想把现在的工程直接复制一份创建新工程,因为这样速度最可,最方便,可以免除工程配置。但是一般工程配置都会和文件名有些关系,而我们创建新工程时都习惯使用一个新的工程名,这就会导致工程不可用。

现在跟大家分享下我使用SourceInsight和EW430的过程中快速创建新工程的经验。

有两个部分需要操作,一是IAR的工程文件,一是SourceInsight的工程文件。

1.把工程文件夹复制一份

2.IAR的工程文件:这里有 .dep  .ewd  .ewp  .eww 这4个文件的文件名改为我们想要的工程名 PrjName。打开 PrjName.eww,点击 Project=》Add Existing Project…=》选择PrjName.ewp。这样IAR工程建立成功。
Tips:
    a.这里需要先把IAR EW中所有打开的文件先关闭,否则可能你更改的是原工程中的文件。切记,这是有血的教训的。
    b.AIR工程中需要使用相对路径,设置方法:打开工程的Option选项对话框=》C/C++ compiler => Preprocessor,在Additional include directories中添加 $PROJ_DIR$、$PROJ_DIR$\源文件夹名、……。 继续阅读 »

IAR EW430 突然无法设置断点_无法单步的问题

问题描述:

IAR 中MSP430的工程在debug时突然出现无法设置断点的情况,而且双击设置断点,没有任何反应和提示或警告。也不能单步运行。换其他工程,可以。

解决思路:

判断是工程设置的问题。本来打算把工程设置一项一项做对比,但是IAR不能同时开两个,所以直接把两个工程的 .ewp 文件做比较。发现其中如下不同: 继续阅读 »

第 1 页,共 2 页12