版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本科毕业设计(论文)题目:Contiki统的跨平台编译运行与调度系统研发摘要本文详细介绍了多变量预测控制算法及其在环境试验设备控制中的应用。由于环境试验设备的温度和湿度控制系统具有较大的时间滞后,而且系统间存在比较严重的耦合现象,用常规的PID控制不能取得满意的控制效果。针对这种系统,本文采用了多变量预测控制算法对其进行了控制仿真。预测控制算法是一种基于系统输入输出描述的控制算法,其三项基本原理是预测模型、滚动优化、反馈校正。它选择单位阶跃响应作为它的“预测模型”。这种算法除了能简化建模过程外,还可以通过选择合适的设计参数,获得较好的控制效果和解耦效果。本文先对环境试验设备作了简介,对控制中存在的问题进行了说明;而后对多变量预测控制算法进行了详细的推导,包括多变量自衡系统预测制算法和多变量非自衡系统预测控制算法;然后给出了系统的建模过程及相应的系统模型,在此基础上采用多变量预测控制算法对环境试验设备进行了控制仿真,并对仿真效果进行了比较。仿真结果表明,对于和环境试验设备的温度湿度控制系统具有类似特性的多变量系统,应用多变量预测控制算法进行控制能够取得比常规PID控制更加令人满意的效果。关键词(小三号,宋体,加粗,居左):多变量系统;预测控制;环境试验设备(关键词3—5个;小四号,宋体;关键词之间用分号隔开;最后一个关键词不打标点符号)(另起页:外文摘要范例;英文摘要和关键词应该是中文摘要和关键词的翻译)Abstract(小三号,TimesNewRoman字体,加粗,居中,上下空一行)。(正文:TimesNewRoman字体,小四号,行距为固定值20磅)Inthispaper,multivariablepredictivecontrolalgorithmanditsapplicationtothecontroloftheenvironmentaltestdeviceareintroducedparticularly.Thetemperatureandhumiditycontrolsystemoftheenvironmentaltestdeviceischaracterizedaslongtimedelayandseverecoupling.Therefore,theroutinePIDcontroleffectisunsatisfactory.Inthiscase,thesimulationofthetemperatureandhumiditycontroloftheenvironmentaltestdevicebasedonmultivariablepredictivecontrolalgorithmismade.Predictivecontrolalgorithmisoneofcontrolalgorithmbasedondescriptionofsystem’sinput-output.Itsthreebasicprinciplesarepredictivemodel,rollingoptimizationandfeedbackcorrection.Itchoosesunitstepresponseasitspredictivemodel,sothatthemodelingprocessissimplified.Inaddition,goodcontrolanddecouplingeffectscouldbepossessedbymeansofselectionsuitableparameters.Inthispaper,theenvironmentaltestdeviceisintroducedbrieflyandtheexistingproblemsareshowed.Thenmultivariablepredictivecontrolalgorithmispresentedparticularly,includingmultivariableauto-balancesystempredictivecontrolalgorithmandmultivariableauto-unbalancesystempredictivecontrolalgorithm.Next,systemmodelingprocessandcorrespondingsystemmodelareproposed.Further,themultivariablepredictivecontrolalgorithmisappliedtothetemperatureandhumiditycontrolsystemoftheenvironmentaltestdevice.Finally,thesimulationresultsarecompared.ResultsofthesimulationshowthatmultivariablepredictivecontrolalgorithmcouldbeusedinthosemultivariablesystemlikethetemperatureandhumiditycontrolsystemoftheenvironmentaltestdeviceandthecontrolresultwouldbemoresatisfactorythanthatoftheroutinePIDcontrol.Keyword(TimesNewRoman字体,小三号,加粗,居左):Multivariablesystem,Predictivecontrol,Environmentaltestdevice(TimesNewRoman字体,小四号)TOC\o"1-3"\h\u13225Abstract 27505(小三号,TimesNewRoman字体,加粗,居中,上下空一行)。 213219第一章绪论 5192621.1Contiki微操作系统的介绍 5141841.2课题的国内外发展现状 5209631.3课题研究主要目标及工作 6158021.4论文内容安排 632719第二章Contiki移植技术的研究 7170102.1Contiki微操作系统架构及源码架构的分析 7212092.2Contiki内部运作机制及移植原理的研究 8327392.2.1Contiki主要数据结构etimer介绍 8267432.2.2Contiki移植的原理 9892.3Contiki在Linux平台试运行 986452.4Contiki移植方法的研究 11103592.4.1stm32f103子目录研究 1184352.4.2Stm32test子目录研究 12269982.5本章小结 1213041第三章Contiki在stm32平台的移植 126783.1Contiki移植涉及的源文件配置 1239753.2Contiki移植涉及的源文件分析 13132063.2.1关于移植的启动文件和链接文件的分析 13274623.2.2关于系统时钟的分析 1432743.3关于串口配置的分析 15291763.4建立移植stm32用户任务 16150893.5本章小结 1713676第四章Contiki跨平台运行技术的研究 18186774.1关于交叉编译的介绍 18153224.2交叉编译工具链的建立 19305564.2.1交叉编译器的介绍 19292354.2.2交叉编译工具链的建立 19316924.3Makefile的编写 21107704.4编译及调试 23209274.4.1编译 23184824.4.2调试 25198654.5本章小结 2512179第五章调度Contiki系统的研究 25281045.1生成复制Contiki的c程序 2558065.2Contiki的启动终止程序 264115.3本章小结 288043(另起页:参考文献范例) 31绪论Contiki微操作系统的介绍Contiki微操作系统是一个小型的,开源的,极易移植的多任务电脑操作系统。它专门设计以适用于一系列的内存有限的网络系统,包括从8位电脑到微型控制器的嵌入系统,适用于联网嵌入式系统和无线传感器网络。Contiki只需几KB的代码和几百字节的内存就能提供多任务环境和内建TCP/IP支持。Contiki完全基于C语言开发、易于移植、支持大量的硬件平台和开发工具、事件驱动机制占用内存小、集成了多种无线传感器网络协议、无专利和版权费、集成仿真工具等特点和优势。Contiki操作系统是基于事件驱动(Event-driven)内核的操作系统,在此内核上,应用程序可以在运行时动态加载,非常灵活。在事件驱动内核基础上,Contiki实现了一种轻量级的名为protothread的线程模型,来实现线性的、类似于线程的编程风格。该模型类似于Linux和windows中线程的概念,多个线程共享同一个任务栈,从而减少RAM占用。Contiki还提供一种可选的任务抢占机制、基于事件和消息传递的进程间通信机制。Contiki中还包括一个可选的GUI子系统,可以提供对本地串口终端、基于VNC的网络化虚拟显示或者Telnet的图形化支持。Contiki系统内部集成了两种类型的无线传感器网络协议栈:uIP和Rime。uIP是一个小型的符合RFC规范的TCP/IP协议栈,使得contiki可以直接和Internet通信。uIP包含了IPv4和IPv6两种协议栈版本,支持TCP、UDP、ICMP等协议,但是编译时只能二选一,不可以同时使用。Rime是一个轻量级为低功耗无线传感器网络设计的协议栈,该协议栈提供了大量的通信原语,能够实现从简单的一跳广播通信,到复杂的可靠多跳数据传输等通信功能。课题的国内外发展现状目前,随着物联网的发展,基于IPv6的无线传感器网络的可行得到了一系列的标准,比如6LoWPAN,是一种基于IPv6的低耗无线个人区域网络规格。Contiki嵌入式操作系统是一个重要的开源系统,多平台特定设备工作实现6LoWPAN功能。它的RFC兼容TCP/IP堆栈功能,提供支持6LoWPAN和很多关联标准。同时,uIP堆栈被整合进Contiki移植操作系统,也增强支持IPv6(uIPv6)。另外,Contiki操作系统包含了一个RPL路由协议的实现,相当于成熟的6LoWPAN支持(IPv6数据包解压和压缩)。Contiki已经被设计的以轻便为主,成功地用于多种硬件平台。Contiki成为无线传感器网络学术研究和产品开发的理想平台,在欧洲已经得到广泛应用,并逐渐得到其它地区开发人员的支持。随着物联网、无线传感器网络的发展,IP地址将耗尽,骨干网络必将升级到IPv6,因此6LoWPAN标准被越来越多的标准化组织所采纳,研发6LoWPAN的人员将越来越多,这将使得Contiki很可能成为嵌入系统中的Linux,在物联网领域得到广泛应用,发挥重要作用。课题研究主要目标及工作本文研究的主要目标是实现Contiki微操作系统在STM32/ARM的跨平台运行,使编译出来的代码能够传到STM32/ARM平台直接运行,并开发出能够复制、启动、中止Contiki微系统的C/C++程序。要实现以上目标,需要搭建x86平台的Ubuntu虚拟机,建立起交叉编译工具链,编译Contiki微操作系统的移植程序,使在linux编译的程序能够在STM32/ARM平台上直接运行,并且开发出能够复制、启动、中止Contiki微系统的C/C++程序。论文内容安排本文主要研究了Contiki微操作系统在stm32的跨平台运行,第一章绪论主要对Contiki微操作系统以及关于Contiki微操作系统的发展现状做简单的介绍,第二章介绍了Contiki移植技术的研究,关于Contiki微操作系统的系统结构及源码架构,了解Contiki系统的运行机制及主要数据结构etimer,通过在Linux平台运行任务来验证通过启动etimer进程来启动Contiki系统,第三章主要研究了Contiki移植涉及的源文件,对他们进行了配置和修改,以方便后面的编译,第四章主要研究了Contiki系统的跨平台技术,介绍了交叉编译工具链,makefile的编写以及目标文件的编译调试,在stm32上运行的结果,第五章主要研究复制、启动、中止Contiki微系统的C程序的开发,第六章为总结。Contiki移植技术的研究Contiki微操作系统架构及源码架构的分析Contiki微操作系统架构为模块化架构,内核基于事件驱动模型,对每个单独的进程都提供可选的线程设施,每个应用程序都可以调用服务程序,Contiki的系统模块化架构如图2-1所示。图2-1接下来对Contiki源代码进行分析,本文研究的Contiki-2.6以例,打开Contiki源文件目录,可以看到主要有apps、core、cpu、doc、examples、platform、tools等目录。下面将分别对各个目录进行介绍。Core:core目录下是Contiki的核心源代码,包括网络(net)、文件系统(cfs)、外部设备(dev)、链接库(lib)等等,并且包含了时钟、I/O、ELF装载器、网络驱动等的抽象。
Cpu:cpu目录下是Contiki目前支持的微处理器,例如arm、avr、msp430等等。如果需要支持新的微处理器,可以在这里添加相应的源代码。
Platform:platform目录下是Contiki支持的硬件平台,例如mx231cc、micaz、sky、win32等等。Contiki的平台移植主要在这个目录下完成。这一部分的代码与相应的硬件平台相关。
Apps:apps目录下是一些应用程序,例如ftp、shell、webserver等等,在项目程序开发过程中可以直接使用。使用这些应用程序的方式为,在项目的Makefile中,定义APPS=[应用程序名称]。在以后的示例中会具体看到如何使用apps。
Examples:examples目录下是针对不同平台的示例程序。Smeshlink的示例程序也在其中。
Doc:doc目录是Contiki帮助文档目录,对Contiki应用程序开发很有参考价值。使用前需要先用Doxygen进行编译。
Tools:tools目录下是开发过程中常用的一些工具,例如CFS相关的makefsdata、网络相关的tunslip、模拟器cooja和mspsim等等。Contiki内部运作机制及移植原理的研究Contiki主要数据结构etimer介绍Contiki采用事件驱动机制,要使Contiki系统运作起来,就需要产生事件,那怎么才能产生事件呢,答案只有两种,第一,通过时钟定时,定时事件到就产生一个事件;第二,通过某种中断,某个中断发生,就产生某个事件例如外部中断。Etimer是Contiki微操作系统5个定时器模型之一,etimer提供一种timer机制产生timedevents,可以理解成etimer是Contiki特殊的一种事件。当etimer到期时,会给相应的进程传递事件PROCESS_EVENT_TIMER,从而使该进程启动,Contiki的etimer链表timelist如图2-2所示。图2-2Contiki移植的原理所以移植的关键就是启动系统时钟,对应到Contiki进程就是启动etimer进程,但只启动一个etimer进程没有意思,所以加上一个LED闪烁进程,使用etimer来定时亮灭。所以综上,最原始的Contiki系统包含一个系统进程(只是比喻,Contiki中进程不分系统与用户)etimer_process,与一个用户进程blink_process。而etimer_process由Contiki系统提供,这里只需对系统时钟进行初始化并定时更新系统时钟(用户自定义current_clock),并判断etimer的下一个定时时刻是否已到(通过比较current_clock与etimer的定时时刻来判定)如果时钟等待序列中有等待时钟的进程那么就调度etimer进程执行,通过其来唤醒相关进程。Contiki在Linux平台试运行先通过编译Contiki系统在Linux平台可运行程序,为移植做准备,验证通过启动etimer进程来启动Contiki系统是否可行。新建文件夹src放置Contiki在Linux平台运行所需依赖文件,再通过编写Makefile链接编译所需头文件,各目录所含文件如表2-1所示。/srcautostart.c,clock.c,etimer.c,main.c,process.c,procinit.c,timer.c/corecontiki.h/core/sysautostart.h,clock.h,etimer.h,process.h,procinit.h.time.h/platform/nativecontiki-conf.h表2-1Main.c中用户进程blink_process如图2-3所示。图2-3下面对运行Contiki任务所需用到函数作简单介绍:PROCESS(blink_process,”blink”):相当于函数的声明;AUTOSTART_PROCESSES(&blink_process):指任务自启动,也可以调用process_start函数来启动进程;PROCESS_THREAD(blink_process,ev,data):用于定义contiki执行任务的实体,里面包含任务所要执行的指令;PROCESS_BEGIN宏和PROCESS_END宏:Contiki规定process的执行必须从PROCESS_BEGIN开始,由PROCESS_END结束;Etimer_set(&et,CLOCK_SECOND):初始化etimer,设置定时器;PROCESS_EVENT_WAIT_UNTIL(etimer_expired(&et)):etimer到期,使进程启动编译结果及运行结果如图2-4所示,由图可以看出Contiki系统及用户进程blink_process在Linux平台运行成功。图2-4Contiki移植方法的研究通过对Contiki源代码的研究,结合课题目标,实现Contiki微操作系统在STM32/ARM的跨平台运行,知道移植的工作主要涉及两个文件夹,第一个是:cpu\arm\stm32f103,第二个是:platform\stm32test,下面对这两个目录进行深入的研究。stm32f103子目录研究时钟模块:clock.c文件,该模块主要用于初始化cpu定时器,计数器,提供systick中断服务。串口配置模块:debug-uart.c文件,该模块主要用于配置串口输入输出,初始化GPIO,使能GPIO时钟,配置GPIO管脚,模式及端口速率等,初始化串口,配置波特率,数据位,奇偶校验等。Stm32f103目录中还包含一些文件,比如stm32f103_conf.h,用于stm32功能的宏定义,startup_stm32f10x.c,stm32的启动文件,stm32f10x.ld,链接文件,这些文件将根据后面移植的实际情况进行配置,或者用stm32的固体库替换掉。Stm32test子目录研究该目录下包含一个不完整的例子contiki-main.c,里面没有任务,在后面的移植中会添加LED灯闪烁进程,该目录还包含一个contiki-conf.h头文件,用于contiki微操作系统的宏定义。本章小结本章主要介绍了Contiki微操作系统的系统结构及源码架构,了解Contiki系统的运行机制及主要数据结构etimer,通过在Linux平台运行任务来验证通过启动etimer进程来启动Contiki系统是否可行,经过实验结果分析,这种做法可行。接着分析了移植到stm32上涉及的文件,并对他们做了简单的分析,接下来要做的就是把这种思想嫁接到stm32平台上去,使得etimer进程和用户进程能够在stm32平台上运行。Contiki在stm32平台的移植Contiki移植涉及的源文件配置本文在stm32平台的移植不使用Contiki本身stm32f103平台的头文件,而是用stm32的固体库全部替换掉,这样使移植简单一些,涉及到Contiki系统的函数使用Contiki内核本来的头文件,接下来配置移植所需源文件。首先在platform文件夹下新建以下文件夹:CMSIS:存放固件的启动文件和M3系列通用文件;FWlib:存放固件库文件,包含芯片所有外设的驱动;StdPeripheral:存放输入输出串口配置文件;在platform/stm32test中添加以下文件:stm32f10x_conf.h:用户配置的头文件;stm32f10x_it.c,stm32f10x_it.h:中断函数;接着新建src文件夹,用于放置移植所需依赖文件。移植所需源文件目录如表3-1所示。/srcautostart.c,clock.c,contiki-main.c,core_cm3.c,debug-uart.c,etimer.c,gpio.c,main.c,misc.c,newlib_stubs.c,process.c,procinit.c,startup_stm32f10x_md.s,stm32f10x_dma.c,stm32f10x_flash_extsram.ld,stm32f10x_gpio.c,stm32f10x_it.c,stm32f10x_rcc.c,stm32f10x_usart.c,system_stm32f10x.c,timer.c,usart.c/corecontiki.h/core/sysautostart.h,clock.h,etimer.h,process.h,procinit.h.time.h/cpu/arm/stm32f103debug-uart.h/platform/CMSIScore_cm3.h,stm32f10x.h,system_stm32f10x.h/platform/FWlib/incmisc.h,stm32f10x_conf.h,stm32f10x_dma.h,stm32f10x_flash.h,stm32f10x_gpio.h,stm32f10x_rcc.h,stm32f10x_usart.h/platform/StdPeripheralByDKgpio.h,usart.h/platform/stm32testcontiki-conf.h,stm32f10x_it.h表3-1Contiki移植涉及的源文件分析上一节中对Contiki移植涉及文件进行了配置,接下来要对个别源文件进行分析修改,以便符合在stm32上的移植。关于移植的启动文件和链接文件的分析在固体库中的启动文件夹中,可以看到有7个不同的启动文件,这些启动文件分别使用于不同容量的stm32芯片,他们分别是:startup_stm32f10x_cl.s:互联网产品,stm32f105/107系列;startup_stm32f10x_hd.s:大容量产品,flash>=256k;startup_stm32f10x_ld.s:小容量产品,flash<=32k;startup_stm32f10x_ld_vl.s:小容量超值型产品;startup_stm32f10x_md.s:中容量产品,64k<=flash<=128k;startup_stm32f10x_md_vl.s:中容量超值型产品;startup_stm32f10x_xl.s:超高密度产品。启动文件里面定义了stm32的堆栈大小以及各种中断的名字及入口函数名称,还有启动相关的汇编代码,因为本文移植采用的芯片是stm32f103rbt6,flash容量为128k,属于中容量产品,所以我们选择的启动文件为startup_stm32f10x_md.s。链接文件stm32f10x_flash_extsram.ld所做的工作是把所有目标文件相应的段连接到一起,并把目标文件中的“变量地址”“函数地址”重定位至正确的地址空间。针对本文所用的stm32f103rbt6芯片,我们需要对链接文件作一定修改,首先要修改FLASH和RAM的起始地址和大小,起始地址分别修改成0x08000000,0x20000000,大小分别修改成20k,128k,还有最高堆栈地址_estack,修改成0x20005000。关于系统时钟的分析在cpu\arm\stm32f103中的clock.c文件,负责初始化时钟,并且通过systick启动etimer,我们需要对他做简单修改,把systick初始化改成:voidclock_init(){ if(SysTick_Config(SystemCoreClock/CLOCK_SECOND))/*systick初始化,重装定时器的值,CLOCK_SECOND定义为100,一个systick10ms*/ { while(1); }}把systick中断改成:voidSysTick_handler(void){(void)SysTick->CTRL;SCB->ICSR=SCB_ICSR_PENDSTCLR;current_clock++;/*系统嘀嗒,描述一段时间内跑的嘀嗒数,一个嘀嗒10ms*/if(etimer_pending()&&etimer_next_expiration_time()<=current_clock)/*timerlist不为空且还没有etimer到期,则执行etimer_request_poll*/ {etimer_request_poll();}/*让etimer_process更快地再次获得执行*/if(--second_countdown==0){current_seconds++;/*系统时间*/second_countdown=CLOCK_SECOND;}}关于串口配置的分析与串口配置相关的文件分别是debug-uart.c,gpio.c,usart.c,stm32f10x_gpio.c,stm32f10x_usart.c。图3-1关于GPIO口的配置,使能GPIOA时钟,配置管脚PA9模式为复用推挽输出,配置管脚PA10模式为浮动输入,配置GPIO口速率为50M,初始化GPIO口,PA9/10管脚为USART1的串行输入输出口,如图3-1所示。关于USART的配置,使能USART1,设置波特率为115200,数据位为8位,停止位1位,没有奇偶校验,没有数据流控制,使能发送或接受,如图3-2所示。图3-2要使用printf()函数,需要将fputc里面的输出指向串口(重定向),在debug-uart.c中配置,如图3-3所示。图3-3建立移植stm32用户任务在contiki-main.c文件中新建led闪烁任务,本文要使神舟一号开发板的PA2管脚led闪烁,在主函数中我们先要进行管脚初始化,使能GPIOA时钟,设置管脚为GPIO_Pin_2,设置管脚模式为推挽输出,任务如图3-4所示,通过GPIO_SetBits()和GPIO_ResetBits()打开和关闭led灯。图3-4本章小结本章主要介绍和分析了移植Contiki微操作系统到stm32上所需的依赖文件以及头文件,这些文件包括stm32的固体库,GPIO口串口的配置文件,以及contiki-main.c文件控制主函数,里面包含用户控制led灯闪烁的任务,通过实现led灯在stm32上闪烁来实现Contiki在stm32上的移植。至此我们完成了移植涉及文件的配置,接下来我们需要通过交叉编译将这些依赖文件生成能够在stm32上执行的目标文件。Contiki跨平台运行技术的研究关于交叉编译的介绍所谓交叉编译就是在一个平台上生成可以再另一个平台上执行的代码,编译的最主要的工作就是在将程序转化成运行该程序的CPU所能识别的机器代码,由于不同的体系结构有不同的指令系统。因此,不同的CPU需要有相应的编译器,而交叉编译就如同翻译一样,把相同的的程序代码翻译成不同CPU的对应可执行二进制文件。要注意的是,编译器本身也是程序,也要在与之对应的某一个CPU平台上运行。一般将交叉编译的主机称为宿主机,也就是普通的通用PC,而将程序实际的运行环境称为目标机,也就是嵌入式系统环境。由于一般通用计算机拥有分层丰富的系统资源、使用方便的集成开发环境和调试工具等,而嵌入式系统的系统资源非常紧缺,无法在其上运行相关的编译工具,因此,嵌入式系统的开发需要借助宿主机(通用计算机)来编译出目标机的可执行代码,交叉编译的过程如图4-1所示。图4-1本文移植所用的宿主机环境是x86平台virtualbox虚拟机搭建的ubuntu系统,要实现移植需要建立交叉编译工具链,将目标程序编译成stm32能运行的可执行代码。交叉编译工具链的建立交叉编译器的介绍通常ARM的交叉编译器为arm-elf-gcc、arm-linux-gcc等,交叉编译器的种类繁多,那么本文又要使用怎么的交叉编译器来完成交叉编译呢,首先我们来介绍一下交叉编译器的命名规则,即根据此规则命名:arch-vendor-kernel-system。arch即系统架构表示交叉编译器,是用于哪个目标系统架构中,用于那个平台中的,即用此交叉编译器编译出来的程序,是运行在哪种CPU上面的arch的值,常见的有很多种,比如arm,x86,mips等等。vendor,即生成厂家,提供商,表示谁提供的,即谁制作出来这个交叉编译器的。vendor的值,可以自己随便填写的。其他常见写法,还有写成编译交叉编译器的作者的自己的名字的。更加通用的做法,好像是把vendor写成,体系架构的值,或者写成CPU的厂家的名字,或者是开发板的名字等等。kernel,直译为,内核,其实指的是,你用此交叉编译器,编译出来的程序,所运行的目标系统,即,此交叉编译器,编译出来的程序,在什么系统中,什么环境中,运行。分为Linux和bare-metal两种,Linux表示编译出来的程序要在有linux操作系统的环境下运行,比如在嵌入式开发中的嵌入式linux中,bare-metal表示没有操作系统的环境,即裸机。system,直译为,系统,其实主要表示的,交叉编译器所选择的库函数和目标系统,最常见的一些值有,gnu,gnueabi,uclibcgnueabi等等。本文要移植的目标板为无操作系统的神舟一号开发板,芯片型号为stm32f103rbt6,所以我们建立的交叉编译器为arm-none-eabi-gcc。交叉编译工具链的建立要得到完整的交叉编译工具链有几种方法,一个是自己编译出一套自己想要的交叉编译工具链,一个是使用交叉编译工具链制作工具制作,一个是使用下载的现成的交叉编译工具链。Crosstool-ng是交叉编译工具链制作工具的一种,使用者可以根据自己的需要配置得到自己想要的交叉编译工具链,刚开始选择crosstool-ng工具制作交叉编译工具链,但遇到很多问题,所以最后选择下载现成的交叉编译工具链,来建立交叉编译环境。下面介绍交叉编译工具链的建立过程:首先在GNUToolsForARMEmbeddedProcessors网站下载最新的交叉编译工具链压缩包gcc-arm-none-eabi-4_8-2014q1-20140314-linux.tar.bz2。新建目录/usr/local/arm:mkdirusr/local/arm。解压交叉工具链压缩包到/usr/local/arm:tar-xvzfgcc-arm-none-eabi-4_8-2014q1-20140314-linux.tar.bz2-C/usr/local/arm在/usr/local/arm目录中可以看到已解压的交叉编译工具链,接下来把交叉编译工具链命令加入环境变量,修改环境变量:sudogedit/etc/environment,在文件中添加路径/usr/local/arm/gcc-arm-none-eabi-4_8-2014q1/bin使环境变量立即生效:source/etc/environment检查是否将路径加入到PATH:echo$PATH,可以看到加入的路径,至此交叉编译工具链安装完成接下来测试安装是否成功,查看交叉编译工具链版本:arm-none-eabi-gcc-v,版本如图4-2所示,交叉编译工具链安装成功。图4-2Makefile的编写一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。在完成了Contiki移植涉及文件的配置和交叉编译工具链的建立之后,接下来就需要编写makefile来连接各个依赖文件,指定需要寻找的头文件路径,以及给出编译指令,最后完成编译。在makefile文件中设置依赖文件路径,这样make就会在指定的目录中寻找依赖文件了,接着声明一些变量,声明变量的好处在于在后面给出指令时,我们不用一个一个的添加依赖文件及目标文件,并且如果需要修改也只需要在变量中做出修改,指令可以保持原样,这样大大提高了编写的效率,变量声明如图4-3所示。图4-3图4-4接着给出编译指令,将所有.c文件和.s文件编译生成二进制目标代码.o文件,接着链接所有.o文件交叉编译生成目标可执行文件Contiki-stm32,因为我们要将代码放到stm32上运行,所以最后生成二进制Contiki-stm32.hex可执行文件,指令如图4-4所示。编译及调试编译在配置好Contiki移植涉及源文件,建立了交叉编译环境以及完成了makefile的编写之后,接下来需要做的就是make生成可执行文件,在终端里进入工作目录,然后执行make命令,编译过程中也遇到了相当多的问题。Error:nosuchfileordirectory在编译的过程中有时会出现头文件Nosuchfileordirectory的错误,检查之后会发现可能是头文件链接时没有链接到,修改makefile的头文件链接目录或者修改include声明可以解决问题。但有时也有可能是系统头文件没有链接到,比如有时#include<sys/..>,ubuntu系统中系统头文件链接目录一般为/usr/include,而sys目录在/usr/include/i386-linux-gnu/sys下,导致链接不到系统头文件,这时可以把头文件加入到/usr/include目录下可以解决问题。Error:undefinedreferencetofunc在编译过程中有时会遇到某个函数没有定义的情况,表示函数没有声明,这种情况下很有可能是没有声明头文件,导致函数没有声明,所以需要找出函数所在头文件,在代码中声明头文件,一般可以解决问题。Error:undefinedreferenceto‘_sbrk’‘_write’etc这个问题困扰我很久,最后才找到解决问题的方法。在本例中通过使用print()函数传输数据输出到stm32串口,而通过查看交叉编译链arm-none-eabi-gcc版本,可以知道交叉编译链with-newlib,newlib是一个面向嵌入式系统的c运行库,占用资源小,具有良好可移植性,可重入性。而我们的宿主机环境中并没有newlib库,所以要使用到newlib的功能时就需要添加桩函数来实现功能,newlib将所有传送数据到设备的操作都归类为write调用,因此为了支持printf()函数,必须实现_write桩函数。在src目录中新建一个文件newlib_stubs.c,这里面包含需要实现newlib功能的桩函数,如下所示,Int_close(intfile);Void_exit(intstatus);Int_fstat(intfile,structstat*st);Int_isatty(intfile);Int_link(char*old,char*new);Int_lseek(intfile,intptr,intdir);Int_read(intfile,char*ptr,intlen);Caddr_t_sbrk(intincr);Int_stat(constchar*filepath,structstat*st);Clock_t_times(structtms*buf);int_unlink(char*name);int_wait(int*status);int_write(intfile,char*ptr,intlen);在实现了_write桩函数后,就可以使用printf()函数,将newlib_stubs.c加入依赖文件,编译后解决问题。在解决了若干问题后编译终于不在出错,生成了若干目标文件和可执行文件,在终端中进入工作目录输入命令ls可以看到目录文件如图所示,.o文件是目标代码,绿色的文件是可执行文件,.hex文件是在stm32上可执行文件。图4-5调试本章小结本章中介绍了交叉编译的概念,在宿主机Linux环境下要生成stm32可执行文件,需要搭建交叉编译环境,建立交叉编译工具链。调度Contiki系统的研究生成复制Contiki的c程序为了实现Contiki系统在Linux系统的复制、启动、终止功能,我们需要开发出相关的c程序,由之前内容可以知道,Contiki系统运行的本质是运行etimer_process,这是一个计时进程,我们再加上一个blink_process任务,这就组成了Contiki系统运行的最基本任务,所以为了实现Contiki系统的复制我们要做的就是完成Contiki在Linux运行程序的复制。在第二章中我们已经开发出了Contiki系统运行的程序,接下来就要完成复制程序的开发。在工作目录下新建文件copy.c,本例中复制文件用到的主要函数是fputs()和fgets()。首先我们定义连个指向文件的指针,然后用fopen()函数以读取二进制的方式打开源文件,以写入二进制的方式打开目标文件,源文件和目标文件不存在时提示错误,接着用fgets()函数从目标文件中取得数据赋给整型变量c,再用fputs()函数将整型变量c数据放入目标文件,完成源文件到目标文件的复制,源代码如图5-1所示。图5-1在终端中输入命令gcc-ocopycopy.c以生成可执行文件,接着执行./copy./Contiki-1306201731/Contiki/Contiki./Contiki-1306201731/Contiki1命令,可以看到在工作目录已经生成了复制的Contiki程序Contiki1,运行./Contiki1指令提示permissiondenied,输入ll查看文件权限可以看到文件不可执行,只需要改变文件权限即可,chmodu+xContiki1,接着再输入命令./Contiki1,可以看到程序正常运行。Contiki的启动终止程序在Linux系统中一般是在终端中直接运行可执行文件来运行程序的,要在c程序中执行可执行文件就要运行系统指令,在c程序中调用系统指令可以用system(),popen(),exec系列函数,在本例中因为没有返回值的问题,启动终止Contiki程序的c程序使用的主要函数为system(),这个函数执行系统的指令。下面简单介绍下system()函数,system()函数是通过调用/bin/sh来执行参数指定的命令,/bin/sh一般是一个软连接,指向某个具体的shell,比如bash,-c选项是告诉shell从字符串command中读取命令;在该command执行期间,SIGCHLD是被
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度网络安全防护服务合同2篇
- 2025版果园租赁与农业观光旅游合作协议2篇
- 二零二五年度屋顶防水隔热彩钢瓦安装服务合同样本2篇
- 2025年度绿色建筑PPP项目合作协议2篇
- 二零二五年度洗衣店加盟商合同范本3篇
- 脚手架安全监理细则模版(2篇)
- 统计行政指导工作方案模版(2篇)
- 低压配电室操作规程(2篇)
- 二零二五年度新型环保建筑材料采购销售合同范本3篇
- 二零二五年度昆明公租房电子合同租赁合同签订与租赁双方责任划分3篇
- 法理学课件马工程
- 《玉米种植技术》课件
- DB51-T 5038-2018 四川省地面工程施工工艺标准
- 第47届世界技能大赛江苏省选拔赛计算机软件测试项目技术工作文件
- 2023年湖北省公务员录用考试《行测》答案解析
- M200a电路分析(电源、蓝牙、FM)
- 2024-2030年全球及中国洞察引擎行业市场现状供需分析及市场深度研究发展前景及规划可行性分析研究报告
- 建筑工程施工图设计文件审查办法
- 置业顾问考核方案
- 吉林市2024-2025学年度高三第一次模拟测试 (一模)数学试卷(含答案解析)
- 自考《英语二》高等教育自学考试试题与参考答案(2024年)
评论
0/150
提交评论