在本章节中笔者将向大家介绍如何基于Makefile创建一个MSP430开发工程。

代码编译过程

由于本教程没有采用常见的IDE的途径进行代码编写调试,而是由开发者自己编写一个Makefile实现项目文件管理的功能,因此需要对MSP430的编译过程有一定的了解。

作为一个标准的GNU C交叉编译器,编译的过程同样遵循【.c文件】--编译--【.o文件】--链接--【可执行的二进制文件】。在MSP430单片机上的可执行文件一般为elf格式,感兴趣的同学可以自行了解该文件格式,其功能作用与51单片机上常见的hex格式文件和飞思卡尔单片机上常见的bin文件类似。

由.c格式的源码文件到.o格式的目标过程称作链接,在这一个过程中需要借助mspgcc(即上一章节中env.sh导出的$CC)完成。在此提供一个简单的示例。新建一个main.c文件,写入如下内容:

int main(void)
{return 0;
}

接着在自身的终端(Windows平台下即Git Bash或Mingw)上敲入如下编译命令:

Admin@RDOFWLHXI6YEJMO /cygdrive/f/WORKSPACE/msp430
$ $CC -mmcu=msp430g2553 -mhwmult=none -std=gnu99 -c main.c -o main.o

执行上述命令若无回显,表明编译成功,此时编译器将在当前目录下生成一个.o文件。在编译阶段所使用的编译参数与我们平常使用gcc编译器编译可执行文件并没有什么区别,仅增加了几个msp430特有的Machine Option(即以-m开头的编译器选项),详情可参考GCC官方手册中的相关说明,在此做简要的解释:

编译选项 描述
--mmcu=msp430g2553 指定msp430的型号。指定型号后编译器将在编译阶段隐式添加相关的型号宏,从而使得开发者可直接使用<msp430.h>;此外,该选项还将影响编译器所使用的指令集(430 ISA/430X ISA)。--mmcu=msp430g2553表示目标MCU型号为msp430g2553,即小红板默认安装的MCU。
-mhwmult=none 表明无硬件乘法器
-std=gnu99 指定采用的C语言语法标准版本
-c 仅进行编译,不进行链接
-o [FILENAME] 指定输出文件名称为FILENAME

完成代码编译后还要将生成的中间目标文件链接成一个可执行文件,完整的构建过程才算完成。mspgcc工具链对此的处理流程与其他gcc工具链没有任何区别,也是通过gcc编译器调用链接器ld完成(Q:为什么不直接使用ld进行链接?A:使用gcc编译的时候往往需要链接某些libc、libgcc相关的文件,若直接使用ld进行链接需要手动添加大量编译参数,十分繁琐)。读者可在上一命令行的基础上尝试执行如下命令行

Admin@RDOFWLHXI6YEJMO /cygdrive/f/WORKSPACE/msp430
$ $CC -mmcu=msp430g2553 $LDFLAGS main.o -o main.elf

在链接阶段的编译参数相比编译少了许多,但同样需要带上--mmcu=msp430g2553这个选项,否则编译器无法确定使用哪个链接脚本文件进行链接。所谓的链接脚本是一个用于指定链接规则的脚本文件,链接器的工作实际上就是执行该链接脚本;链接脚本一般由工具链自带,对于MSP430来说一般不需要开发者对其进行修改;链接脚本在嵌入式领域的主要作用为指定CPU/MCU的存储空间分布。mspgcc工具链的链接脚本文件均放置于include目录下,该路径并不在环境变量$PATH中,因此上一教程的env.sh导出了一个$LDFLAGS环境变量用于在链接阶段使用-L参数指定链接脚本的所在路径。链接阶段结束之后编译器将在当前目录下生成一个.elf文件即我们最终所需的可执行文件。

代码烧写

代码的烧写需要基于mspdebug这一工具实现,这一工具同样是在命令行环境下使用的,其基本的命令格式为

mspdebug [options] <driver> [command ...]

其中的<driver>是必填项目,用于指定下载器的种类。先前在网上参考的教程均是选择rf2500进行烧写的,然而笔者多次尝试未果,机智地改为tilib方才烧写成功!(P.S.:这一过程浪费了大量的时间,实在是坑。。)

以将上文编译好的main.elf文件烧录至小红板为例,代码烧写的基本命令为(其中的$MSPDEBUG变量也是由上篇教程的env.sh脚本封装的变量)

Admin@RDOFWLHXI6YEJMO /cygdrive/f/WORKSPACE/msp430
$ $MSPDEBUG tilib 'prog main.elf'

该命令亦可分步执行,即先进入mspdebug自身的控制台界面,再输入下载指令

Weilun@RDOFWLHXI6YEJMO /cygdrive/f/WORKSPACE/msp430
$ $MSPDEBUG tilib
MSPDebug version 0.22 - debugging tool for MSP430 MCUs
Copyright (C) 2009-2013 Daniel Beer <dlbeer@gmail.com>
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.MSP430_GetNumberOfUsbIfs
MSP430_GetNameOfUsbIf
Found FET: HID0268:COM3
MSP430_Initialize: HID0268:COM3
Firmware version is 20409001
MSP430_VCC: 3000 mV
MSP430_OpenDevice
MSP430_GetFoundDevice
Device: MSP430G2xx3 (id = 0x00de)
2 breakpoints available
MSP430_EEM_Init
Chip ID data: 25 53Available commands:=           erase       isearch     power       save_raw    simioalias       exit        load        prog        set         stepbreak       fill        load_raw    read        setbreak    symcgraph      gdb         md          regs        setwatch    verifydelbreak    help        mw          reset       setwatch_r  verify_rawdis         hexout      opt         run         setwatch_wAvailable options:color                       gdb_loopenable_bsl_access           gdbc_xfer_sizeenable_locked_flash_access  iradixfet_block_size              quietgdb_default_portType "help <topic>" for more information.
Use the "opt" command ("help opt") to set options.
Press Ctrl+D to quit.(mspdebug) prog main.elf
prog main.elf
Erasing...
Programming...
Writing    2 bytes at fffe [section: __reset_vector]...
Writing    4 bytes at c000 [section: .rodata2]...
Writing   22 bytes at c004 [section: .text]...
Done, 28 bytes total

从上文打印的输入日志中还可以看到mspdebug工具提供的其他控制台命令,例如break/delbreak(增删断点)、gdb(创建一个gdb server)、reset(复位)等。

编写一个简单的Makefile

有了上个章节的基础,我们就可以自己动手编写一个Makefile。但可能有不少读者朋友并不喜欢Makefile的语法或自己手动书写Makefile,甚至完全没接触过Makefile,本教程在此提供一个精简的Makefile模板可直接使用(使用限制:源码、中间文件、最终目标文件均在同一目录下,即flat型目录结构),但还是建议大家能够书写一个属于自己的Makefile。本教程在此不会对Makefile的语法作展开讲解,但Makefile中均配以重要的注释供读者理解,该示例Makefile的主体思路为封装编译参数->指定编译依赖规则(这一过程中使用了模式匹配以应对多个.c文件生成一个最终目标文件的场景;此外还引入了.d依赖文件完善依赖规则)->添加非编译操作的伪目标。

# 配置编译工具链
CROSS_COMPILE ?= msp430-elf-
CC            ?= $(CROSS_COMPILE)gcc
MSPDEBUG      ?= mspdebug# 配置编译参数
# 定义目标MCU型号与调试驱动
MCU           := msp430g2553
DEBUG_DRIVER  := tilib
# CFLAGS为编译阶段参数
#  @note: 此处必须加上CFLAGS变量添加由env.sh导出的编译参数,否则可能会出现
#         头文件找不到的报错(下方的LDFLAGS同理)
CFLAGS  := -mmcu=$(MCU) -mhwmult=none -MMD -std=gnu99 $(CFLAGS) -c
# LDFLAGS为链接阶段参数,将影响编译器调用链接器的具体方式
LDFLAGS := -mmcu=$(MCU) $(LDFLAGS)
# 定义目标文件名称
TARGET  := main
ELF     := $(TARGET).elf
SRCS    := $(wildcard *.c)
DEPS    := $(SRCS:.c=.d)
OBJS    := $(SRCS:.c=.o)# 定义all目标,最终需要生成一个elf格式的二进制文件
all: $(ELF)# .elf文件由.o文件链接生成
$(ELF): $(OBJS)$(CC) $(LDFLAGS) $^ -o $@# .o文件由.c文件编译生成
%.o: %.c$(CC) $(CFLAGS) $< -o $@.PHONY: clean flash mostlyclean
# 清除中间文件与目标文件
clean:rm -f *.elf *.o# 烧写程序
flash:$(MSPDEBUG) $(DEBUG_DRIVER) --force-reset "prog $(ELF)"# 在clean操作的基础上清除.d文件
mostlyclean:rm -f *.d *.elf *.o# 引入.d依赖文件
-include $(DEPS)

该示例Makefile的基本用法为

命令 功能
make 编译并链接生成可执行文件
make clean 清除编译过程中产生的中间文件与最终目标文件
make mostlyclean 在make clean的基础上清除.d依赖文件
make flash 烧写最终目标文件至单片机

MSP430G2-LaunchPad简明教程03[创建一个MSP430工程]相关推荐

  1. [转]VS2010 教程:创建一个 WPF 应用程序 (第一节)

    [转]VS2010 教程:创建一个 WPF 应用程序 (第一节) http://msdn.microsoft.com/zh-cn/ff629048(zh-cn) Extended WPF Toolki ...

  2. Scott Mitchell 的ASP.NET 2.0数据教程之一: 创建一个数据访问层

    原文 | 下载本教程中的编码例子 | 下载本教程的英文PDF版 导言 作为web开发人员,我们的生活围绕着数据操作.我们建立数据库来存储数据,写编码来访问和修改数据,设计网页来采集和汇总数据.本文是研 ...

  3. java写七彩文字_【PS精选案例教程】创建一个漂亮的七彩文字

    原标题:[PS精选案例教程]创建一个漂亮的七彩文字 效果图: 步骤1. 新建一个文档(大小随意) 步骤2. 滤镜→渲染→云彩 步骤3. 可以按Ctrl+Alt+F增加效果 步骤4. Ctrl+J复制一 ...

  4. Servlet学习DAY_01:服务器概念/Web服务器的作用/ Servlet概念/ 如何关联和解除Tomcat/ 创建一个Web工程 /Servlet响应流程/ Get-Post /常见异常

    Servlet 什么是服务器 服务器就是一台高性能电脑 电脑上安装了提供服务的软件就称为 xxx服务器 举例: 邮件服务器: 就是在电脑上安装了提供邮件收发服务的软件 ftp服务器: 就是在电脑上安装 ...

  5. 使用keil软件创建一个STM32工程

    使用keil软件创建一个STM32工程 ----------------芯片:STM32F429IGT6 创建一个STM32F429IGT6的工程,其他型号的单片机也大同小异.因为最近开始学习STM3 ...

  6. SoapUI——创建一个SOAP工程

    本章简单介绍SOAP工程包括创建工程,介绍面板区域功能. 目录 前言 1 创建工程 1.1 SOAP 工程 1.2 REST 工程 2 引入工程 前言 SoapUI工程在导航树的根节点下,Soap工程 ...

  7. CCS6 自己创建一个新工程

    对于新手来说通常是直接将例程直接导入CCS中,观察实验现象,但是如果自己从零创建一个新工程该怎么办呢??? 1.首先打开CCS软件在主界面点击project->New ->CCS Proj ...

  8. Android Studio 导入 so 简明教程:通过一个示例让你理解整个过程

    Introduction 如果你是一名 C/C++ 开发人员,正在尝试将 C/C++ 的代码往安卓上迁移,那么这篇文章对你有很大的帮助 如果你是一名 Android 开发人员,正在尝试将外部 so 嵌 ...

  9. Kile5安装教程和创建一个工程举例【图文STM32F407ZE芯片为例】

    文章目录 [一]开始安装 keil5 STM32F407ZE为例 [二]STM32工程创建步骤 [三]安装J-Link驱动+ST-LINK驱动及教程 [四]STM32的命名规则举例 --->面试 ...

  10. PS网页设计教程XXIII——创建一个售卖iPhone 5应用程序的网站

    作为编码者,美工基础是偏弱的.我们可以参考一些成熟的网页PS教程,提高自身的设计能力.套用一句话,"熟读唐诗三百首,不会作诗也会吟". 本系列的教程来源于网上的PS教程,都是国外的 ...

最新文章

  1. 非常可乐(杭州电子科技大学第四届大学生程序设计竞赛)(九度2013年教程87题)
  2. 我用hbuilder怎么用不了jquery_【权益资讯】机房电脑用不了怎么办
  3. uni-app-页面结构
  4. n条直线相交最多有几个邻补角_【东升二中数字课堂】创意微课直线的交点|Super数学璐...
  5. 群人各说什么是哈希算法?
  6. 计算机操作系统(10):集群和分布式
  7. 2014年英语一阅读理解Text1
  8. JavaScript的学习--生成二维码
  9. [转载] python3.6版本生成的python脚本如何打包为可独立执行的exe程序
  10. java判断手机号_Java验证手机号
  11. 图解css3:核心技术与案例实战. 导读
  12. Pytorch-> pack_padded_sequence()和pad_packed_sequence()
  13. 什么是白箱测试、黑箱测试、回归测试?
  14. 【reverse】2021 极客大挑战(部分)
  15. 字符版本贪吃蛇游戏设计及算法
  16. 服务器更新git版本报错 git-compat-util.h:14:2:error “Required C99 support is in a test phase“
  17. python-opencv控制鼠标操作
  18. python实现基金定投并可视化结果(及时止损)
  19. MongoDB数据库常用SQL命令
  20. 服务器做两个VD可以装系统,华为RH2288V5服务器创建多个VD(Virtual Disk)

热门文章

  1. 服务器3D场景建模(五):体素场景(三)
  2. 光照度传感器之RS485 通信与 Modbus 协议
  3. 10年的工作经验?还是1个经验反复用了10年?
  4. linux主机做racl,linux学习日记十一 账号管理与ACL权限设置
  5. LLVM创始人Chris Lattner回顾展望编译器
  6. 二十二.基于国民MCU 的COMP模块的比较案例
  7. sql中interval用法总结
  8. ceph 代码分析 读_Ceph代码分析
  9. 理解服务器证书 CASSL
  10. 智和网管平台SugarNMS政府部门综合网管