电子技术论坛

?找回密码
?亚博网上开户

QQ登录

只需一步,快速开始

搜索
查看: 1808|回复: 2
打印 上一主题 下一主题

IAR的MSP430 C编程基础知识

[复制链接]

624

主题

627

帖子

416

积分

专栏作家

Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25

积分
416
跳转到指定楼层
1#
发表于 2015-4-6 15:55:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
IAR的MSP430 C编程基础知识
  通常我们开发单片机程序都是使用C语言的,为什么C语言比汇编方便呢?原因就是C编译器在为我们做着大量的琐碎的组织翻译工作。在此感谢IAR,辛辛苦苦的劳动着,却没有辛苦钱!
  好,我们从新建一个工程开始,打开IAR,空白,project,create new project,C,main,确定。给工程起个名字,保存。OK,工程建立完毕了。这时工程里已经有个main.c了,并且有一个完整的程序,如下:
  1. #include "io430.h"
  2. int main( void )
  3. {
  4. // Stop watchdog timer to prevent time out reset
  5. WDTCTL = WDTPW + WDTHOLD;
  6. return 0;
  7. }
复制代码

  Make一下,保存工作区文件,就可顺利编译通过了。
  (本人所使用的IAR版本为5.3,为了能体验更好的IAR特性,请使用较新且较稳定的版本)
  从头文件包含说起,这个io430.h是IAR为C语言所推荐的头文件,这个头文件以匿名结构体的形式对430的寄存器进行声明,匿名结构体已经在C11中纳入标准C,这种声明方式在ARM中广为流传。之前较早的版本可能使用的是msp430.h,这个头文件都是以宏定义的形式对寄存器进行声明的,C和汇编都可以包含此文件,这里有丰富的宏定义,如SELA__REFOCLK,选择REFOCLK作为ACLK。这在io430.h是没有的,因此如果以前的工程包含的是msp430.h,那么移植到使用io430.h将会出现一些问题。
  头文件的选择根据自己的习惯决定,但是像画蛇添足一样把头文件改成#inlcude “msp430f149.h”就没有必要了,因为IAR已经自动帮我们选择了合适的头文件,这在移植到其他的器件时,不用做任何更改;我们所要做的就是在工程的option中,选择我们的device,我们新建的这个工程默认的device为msp430f149,现在我们更换器件为msp430f5418A,重新make一下。我们来看工程左边的文件拓扑结构,如图1.1:
  从此图中我们可以得到相当可观的信息:
  1. IAR为我们自动包含了io430f5418a.h和intrinsics.h
  2. 就是test.d43所包含的这些文件:test.d43是最终生成的可执行文件。这个可执行文件是由他下面的4个连接而成的。Main.r43是由main.c生成的目标文件;dl430xsfn.r43就是大名鼎鼎的C运行时库,大家觉得这个词汇熟悉吗?运行时库会根据工程的设置不同而不同,IAR中约有20左右个运行时库,具体可参考compiler reference;Lnk430f5418a.xcl文件中包含芯片的存储器组织结构,用来指定程序数据和代码的存放位置;mutipiler43_loc2.xcl是因为5418a内部具有硬件乘法器而出现,告知编译器用硬件乘法器来进行乘法运算。
  现在来了解一下一个耳熟的词汇:C运行时库
  众所周知,在单片机上电瞬间,只有flash中有数据和代码,RAM的内容是不确定的。单片机执行的第一条指令绝对不是main函数,而是C运行时库的初始化函数,为我们写的C代码搭建C运行时环境。首先设置SP,也就是设置栈,SP通常设置为RAM的最高地址。其次就是初始化内存,初始化全局变量,静态变量,以及在RAM中的函数,这些数据都是从flash中拷贝过来的,因此我们的变量不仅仅占用着RAM,还有可能占据着一份flash(未初始化的全局变量和静态变量初始化为0,将未初始化的数据放在一个区域,只需要将这个区域清0即可,不需要从flash拷贝)。数据初始化完毕后就开始从main函数开始了,执行我们所写的代码。因为430的看门狗在复位之后是开着的,因此需要初始化数据量过大的话,就有可能导致看门狗溢出复位,从而main函数永远得不到执行。解决此问题的办法就是在程序中加入一个函数:int __low_level_init(void),在此函数中加入停止看门狗的语句,并返回1即可,__low_level_init函数将在初始化代码之前执行。
  注:初始化代码并未包含在dl430xsfn.r43中,应该是由编译器单独生成的一段代码,我理解这些代码应该属于C运行时库的范畴。这都是我的个人见解。
  C运行时库还包含着所有的C标准库,如strlen、memcpy等函数;还有乘除法的实现等等。

0

主题

2

帖子

6

积分

面试会员

Rank: 1

积分
6
2#
发表于 2019-7-23 11:16:28 | 只看该作者
学习新的知识,多谢分享!

1

主题

11

帖子

62

积分

新手入门

Rank: 3Rank: 3

积分
62
3#
发表于 2019-7-24 08:09:10 | 只看该作者
多谢分享!
您需要登录后才可以回帖 登录 | 亚博网上开户

本版积分规则

手机版|电子技术论坛 ( 鄂ICP备09003585号-2 )

GMT+8, 2019-9-5 19:23 , Processed in 0.064124 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

? 2001-2018 Comsenz Inc.

快速回复 返回顶部 返回列表