丹弗斯代码elua keil是什么意思

1600人阅读
elua(10)
上文中介绍了什么是elua,本文将动手实验,编译elua,并烧写于stm32f4discovery平台之上
必要的前提:
ubuntu操作系统,用于作为交叉编译的环境(我用的是14.04,不过其他版本应该没问题)
git(没有的话apt-get installgit)
stm32f4discovery开发板
mini usb线
micro usb线
安装依赖:
apt-get install 5.1(最好装5.1,5.2没试过)
apt-get install luarocks
luarocks install luafilesystem
luarocks install lpack
luarocks install md5
安装工具链:
首先说明这里的工具链与elua官方推荐的不同(codesoourcery),而是采用
原因详见最后一节
首先根据链接下载gcc-arm-none-eabi-4_8-40609-linux.tar.bz2,假设下载文件保存位置为用户根目录~
解压缩:tar -xvjfgcc-arm-none-eabi-4_8-31204-linux.tar.bz2
在sh的配置文件中添加
exportPATH=$PATH:~/gcc-arm-none-eabi-4_8-2014q2/bin
设置好后可以做一个测试:
$ arm-none-eabi-gcc–print-multi-lib
下载elua源代码
git clone/elua/elua.git
编译elua源代码
进入elua目录
luabuild_elua.lua board=stm32f4discovery
*********************************
CompilingeLua ...
CPU:&&&&&&&&&&& &&&&&&&&& STM32F407VG
Board:&&&&&&&&& stm32f4discovery
Platform:&&&&&& && stm32f4
Allocator:&&&&& &&& multiple
BootMode:&&&&& &&&&&&&& standard
Target:&&&&&&&& && lua
Toolchain:&&&&& && codesourcery
ROMFSmode:&&&& &&&&&& verbatim
Version:&&&&&&& && v0.9-215-gc216dd2
luabuild_elua.lua board=stm32f4discovery–c相当于clean
prog 是生成hex和bin文件,用于烧写,如果没有prog选项,只生成elf和map文件
烧写elua镜像
先安装依赖
whichautoconf
没有sudo apt-get install autoconf
同理sudo apt-getinstall libusb-1.0
sudo apt-get install pkg-config
下载stlink的代码
git clone /texane/stlink stlink.git
编译stlink的代码
cd stlink.git
./autogen.sh
./configure
sudo cp st-flash /usr/bin
安装udev,好识别stlink设备
sudo cp *.rules /etc/udev/rules.d
sudo restart udev
用miniusb连接pc和stm32f4discovery
命令行输入(elua 目录下):
st-flash write elua_lua_stm32f4discovery.bin 0x8000000
连接stm32f4discovery
用micro usb连接pc和stm32f4discovery,linux不需要驱动,在/dev目录下有ttyACM0
使用cutecom作为串口终端(sudo apt-get install cutecom)
打开cutecom sudo cutecom
ttyACM0 115200 n 8 1
注意回车和换行
将返回elua shell的帮助,关于elua shell 的信息将在第四篇文章中涉及
官方推荐的工具链codesourcery的问题
最开始我参考的了官方文献:
根据官方推荐安装sourcery的lite 版本(免费)注意为for ARM EABI
Obtainingand installing the toolchain is very easy:
1.&&&&&&&&go to the CodeSourcery download location for the toolchain.
2.&&&&&&&&select from the table the current version in the &EABI&line (the link to the current version is just above the &Allversions...& link).
3.&&&&&&&&download and run the installer.
下载arm--arm-none-eabi.bin
安装/bin/sh arm--arm-none-eabi.bin
export PATH=/home/XXX/MentorGraphics/Sourcery_CodeBench_Lite_for_ARM_EABI/bin//bin:$PATH
这时需要验证一下
$ arm-none-eabi-gcc–print-multi-lib
对比GNU的版本我们可以发现,少了很多库,其中就没有对硬浮点的支持(这个时候来出现链接错误后,查了很多文件才发现)
编译 luabuild_elua.lua board=stm32f4discovery
链接时报错:
好长的一个错误,字面上看ld错误,libm.a不支持VFP
上网搜索 stm32f4discovery uses VFPregister arguments 等关键字,发现:
There are a variety of arm-toolchains outthere. These include,&,, and the&&toolchain.Of
these toolchains, the two most popular ones are the codesourcery Lite (ownedby mentor Graphics) and the gcc-arm toolchain.Traditionally I would use the Codesourcery Litetoolchain. However that toolchain does
not provide “hardfp” (hardware floatingpoint) support.So If I choose to use it with say the stm32F4Discovery board in the future, Iwill not be able to
take full advantage of the floating point unit (FPU) on thestm32F4 microcontroller on board. The gcc-arm toolchain on the other hand hashardfp support and can be used with all Cortex-M0,M3 and M4 parts. Thisuniversality is why I& will choose it even though
I will most likely onlyfocus on Cortex-M0 cores. And so for the purpose of this tutorial, I will beusing the&&toolchain.
I have startedworking on STM32F4 Discovery board and have compiled and run a few basicprograms using the latest Yagarto toolchain containing the GCC 4.6.2. Latelythough on several forums I have read that many toolchains
including the latestYagarto have problems when it comes to using the on-board hardware FPU.Ihave also read that the latest CodeSourcery toolchain does support hardwarefloating
point, but not in the lite edition!!
While digging deepinto the topic I found this toolchain which is specifically for ARM Cortex M/Rcontrollers, and claims to have no problems when it comes to hardware FPU.
两种解决方案:
第一种,换工具链,如上文中GNU的工具链
第二种,将硬浮点改为软浮点:
FP32with fpu enabled
Software floating point emulation, which is the default. In this case, the compiler implements floating-point arithmetic by means of library calls.VFP hardware floating-point support using the soft-float ABI. This is selected by the&-mfloat-abi=softfp&option. When you select this variant, the compiler
generates VFP floating-point instructions, but the resulting code uses the same call and return conventions as code compiled with software floating point.VFP hardware floating-point support using the VFP ABI, which is the VFP variant of the Procedure Call Standard for the&ARM(R) Architecture (AAPCS). This ABI uses VFP registers to pass function arguments and return values,
resulting in faster floating-point code. To use this variant, compile with&-mfloat-abi=hard.
判断是浮点编译选项的问题,库文件和编译选项不兼容
查找elua源代码,搜索“mfloat-abi”,发现在/src/platform/stm32f4/conf.lua
localtarget_flags = { '-mcpu=cortex-m4', '-mthumb','-mfloat-abi=hard','-mfpu=fpv4-sp-d16' }
local target_flags = {'-mcpu=cortex-m4', '-mthumb','-mfloat-abi=softfp}
不过需要clean一下
luabuild_elua.lua board=stm32f4discovery –c
luabuild_elua.lua board=stm32f4discovery
target=lualong
--和-mfloat-abi=softfp有关,如果默认target=lua为float 类型,有console,但是输入lua命令后没反映
*********************************
CompilingeLua ...
CPU:&&&&&&&&&&& &&&&&&&&& STM32F407VG
Board:&&&&&&&&& stm32f4discovery
Platform:&&&&&& && stm32f4
Allocator:&&&&& &&& multiple
BootMode:&&&&& &&&&&&&& standard
Target:&&&&&&&& && lualong
Toolchain:&&&&& && codesourcery
ROMFSmode:&&&& &&&&&& verbatim
Version:&&&&&&& && v0.9-215-gc216dd2
ok通过编译,不过此时的lua不能支持浮点运算
参考文献:
下一篇文章,将定elua的编译选项,添加和删除一些功能模块(例如wofs文件系统等)
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:37555次
排名:千里之外
原创:27篇
转载:15篇
(2)(1)(1)(2)(1)(3)(11)(1)(1)(4)(4)(1)(9)(1)(1)还没有帐号? 赶紧
用户版块帖子
再献精品:M3 上的高级脚本语言,移植 elua for GD32F103RET6
UID:1023450
在线时间1723小时
M币1390专家30
&&发表于: 前天 14:45
elua:&& 一、关于Lua脚本语言Lua 是一个小巧的脚本语言。是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所组成并于1993年开发。 Lua语言设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,Ini等文件格式,并且更容易理解和维护。 一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。以上资料来自百度百科:
二、移植和构建 elua&&for&&gd32执行文件:1 从 下载全部源程序;2 定义板子,在elua-master\boards\kown 下建立一个文本文件:gd32f1-re.lua-- gd32103ret6 build configurationreturn {&&cpu = 'gd32f103re',&&components = {&&&&sercon = { uart = 0, speed = 115200, buf_size = 128 },&&&&wofs = true,&&&&romfs = true,&&&&shell = true,&&&&term = { lines = 25, cols = 80 },&&&&cints = true,&&&&luaints = true,&&&&linenoise = { shell_lines = 10, lua_lines = 50 },&&&&stm32_enc = true,&&&&rpc = { uart = 0, speed = 115200},&&&&adc = { buf_size = 4 },&&&&xmodem = true,&&},&&config = {&&&&egc = { mode = &alloc& },&&&&vtmr = { num = 4, freq = 10 },&&&&clocks = { external = , cpu =
},&&},&&macros = {&&&&{&GD32F103RET6&&&&&&&&&&&&&&&&&&&&&&&&&&& },&&&&{ &CPU&,&&&&&&&&&&&&&&&&&& &GD32F103RET6& },&&&&{ &OSC&,&&&&&&&&&&&&&&&&&& && },&&&&{ &F_CPU&,&&&&&&&&&&&&&&&& && },&&},&&modules = {&&&&generic = { 'all', '-i2c', '-net' },&&&&platform = 'all',&&}}3 定义cpu ,打开 elua_master\build_data.lua,在 platform_list&&表中 stm32 中增加GD32F103RE的mcu: &&&&stm32 = { cpus = { 'STM32F103ZE', 'STM32F103RE','GD32F103RE' }, arch = 'cortexm' },4 板子定义头文件:在elua_master\src\platform\stm32\ 增加一个 cpu_gd32f103re.h:// CPU definition file for gd32F103RE#ifndef __CPU_GD32F103RE_H__#define __CPU_GD32F103RE_H__#include &type.h&#include &stacks.h&#include &stm32f10x.h&#include &platform_ints.h&// Number of resources (0 if not available/not implemented)#define NUM_PIO&&&&&&&&&&&&&& 7#define NUM_SPI&&&&&&&&&&&&&& 2#define NUM_UART&&&&&&&&&&&&&&5#define NUM_TIMER&&&&&&&&&&&& 5#define NUM_PHYS_TIMER&&&&&&&&5#define NUM_PWM&&&&&&&&&&&&&& 4#define NUM_ADC&&&&&&&&&&&&&& 16#define NUM_CAN&&&&&&&&&&&&&& 1#if !defined(GD32F103RET6) #define GD32F103RET6&&&&&&&&&&//RET6 12 OSC 120m#endif&&&&//#define STM32F103RET6#define ADC_BIT_RESOLUTION&&&&12u32 platform_s_cpu_get_frequency();#define CPU_FREQUENCY&&&&&&&& platform_s_cpu_get_frequency()// PIO prefix ('0' for P0, P1, ... or 'A' for PA, PB, ...)#define PIO_PREFIX&&&&&&&&&&&&'A'// Pins per port configuration:// #define PIO_PINS_PER_PORT (n) if each port has the same number of pins, or// #define PIO_PIN_ARRAY { n1, n2, ... } to define pins per port in an array// Use #define PIO_PINS_PER_PORT 0 if this isn't needed#define PIO_PINS_PER_PORT&&&& 16// Internal memory data#define SRAM_SIZE&&&&&&&&&&&&&&&&&&&&&& ( 64 * 1024 )#define INTERNAL_RAM1_FIRST_FREE&&&&&&&& end#define INTERNAL_RAM1_LAST_FREE&&&&&&&&&&( SRAM_BASE + SRAM_SIZE - STACK_SIZE_TOTAL - 1 )#define INTERNAL_FLASH_SIZE&&&&&&&&&&&& ( 512 * 1024 )#define INTERNAL_FLASH_SECTOR_SIZE&&&&&&&&2048#define INTERNAL_FLASH_START_ADDRESS&&&&&&0x// Interrupt list for this CPU#define PLATFORM_CPU_CONSTANTS_INTS\&&_C( INT_GPIO_POSEDGE ),&&&& \&&_C( INT_GPIO_NEGEDGE ),&&&& \&&_C( INT_TMR_MATCH ),&&&&&&&&\&&_C( INT_UART_RX ),#endif // #ifndef __CPU_STM32F103RE_H__5&&根据 第2步 中的一个宏定义 GD32F103RET6,在stm32及stm32/FWLIB中 和RCC有关的文件中修改相关参数:按:#if&&defined(GD32F103RET6)&&&&&&&&&&&&&& ............. //按 gd32 使用 12M 晶振,120M主频修改相关代码,及启动延时等修改;&&&&&& #else&&&&&&&&&&&&&&..............//原来的代码&&&&&&#endif6 因为代码生产也是使用了lua脚本,因此需要下载个 pc版本的lua解释程序,LuaForWindows_v5.1.4-46.exe(百度搜索,下载安装)7 做个批处理命令脚本:在elua_master 下建个 arm_gcc_sh.cmd 脚本文件,将 GCC工具链路径和lua 运行路径加入path 环境变量,我脚本如下:@REM Launch the bash shell under win32@ECHO OFFset old_PATH = %PATH%PATH =\App\arduino166\hardware\tools\arm-none-eabi\5.4.0-2016q2\C:\Program Files\Lua\5.1;%PATH%echo **************************************************echo **** lua build_elua.lua board=stm32f4-ve prog ****echo **** lua build_elua.lua board=stm32f1-re prog ****echo **** lua build_elua.lua board=gd32f1-re prog ****echo **************************************************cmdPATH = %OLD_PATH%8&&运行arm_gcc_sh.cmd 并键入命令:lua build_elua.lua board=gd32f1-re prog:
9 成功编译,可在elua_master&&找到 elua_lua_gd32f1-re.hex,将该文件烧写到gd32中,联上usb转串口,115200bps 8N1 ,reset后可见开机信息:表明,程序无误(第一行 &&是我在 /rom 下建了个示范程序&&autorun.lua自动开机运行的结果)10 输入help 得到全部 shell下的命令:
11 输入 ls ,可列出 rom盘和wo盘中的文件:
12 输入 lua 回车即可进入lua交互环境:
现在可以试试 lua命名了:print (“”)也可以执行其中的脚本:dofile(“/rom/led.lua”)支持的lua模块:(详
) 13&&12M晶振,115200 串口1,&&gd32f103ret6 elua 执行文件尝鲜版本(尚未全部测试):elua_lua_gd32f1-re.rar,下载&& 代码 长度200多k,还有200多k 空间作为 一个内建 /WO 虚拟盘存放 lua脚本、数据,玩玩还是可以的。14&&下一步增加一个 /MMC&&SD盘,更方便存放数据和脚本;15 其它: elua-master\doc 中全部模块的使用文档,elua-master\examples中有各种lua应用的脚本代码,在此基础上可以试试很多原来需要经过复杂编程、烧写、排错等步骤,现在直接运行lua代码就可以达到了。[ 此帖被huaweiwx在 15:02重新编辑 ]
本文内容包含图片或附件,获取更多资讯,请
后查看;或者
成为会员获得更多权限
本帖提到的人:
好文章必须顶
老大的帖子必须顶
厉害啊,表示看不懂,老老实实玩arduino吧
大师级别的文字看不懂
不错。不知有没有在IAR或keil下的集成式开发包?普通C工程+LUA。如果能做到,很多地方可以替换PLC了。
感谢大大又带来实力干货
UID:1795013
在线时间403小时
M币11399专家39
&发表于: 前天 14:46
感谢大大又带来实力干货
UID:1351094
在线时间42小时
M币574专家3
&发表于: 前天 15:54
不错。不知有没有在IAR或keil下的集成式开发包?普通C工程+LUA。如果能做到,很多地方可以替换PLC了。
UID:1992537
在线时间178小时
M币1078专家0
&发表于: 前天 15:59
大师级别的文字看不懂
UID:1023450
在线时间1723小时
M币1390专家30
&发表于: 前天 16:06
回 amo73 的帖子
:不错。不知有没有在IAR或keil下的集成式开发包?普通C工程+LUA。如果能做到,很多地方可以替换PLC了。 ( 15:54) lua 包括嵌入应用的 elua及轻量级的tlua,都是用的 GUN GCC工具链,由于支持几十种cpu的多平台支持,部分代码及宏定义是通过lua脚本来处理和生成的,至于针对特定cpu如 stm32,我觉得,移植到iar 或keil也是可以的,但做各个工作没有必要,维护工作量大,下次有新的elua版本,只能自己更新了;&&&&核心代码不用改,只要按其中文档说明的方法定义和裁剪不需要的模块,或添加相关模块,重新build就可以了,用惯了gcc,我现在都不用其它编译器了。
UID:1351094
在线时间42小时
M币574专家3
&发表于: 前天 16:26
回 huaweiwx 的帖子
:lua 包括嵌入应用的 elua及轻量级的tlua,都是用的 GUN GCC工具链,由于支持几十种cpu的多平台支持,部分代码及宏定义是通过lua脚本来处理和生成的,至于针对特定cpu如 stm32,我觉得,移植到iar 或keil也是可以的,但做各个工作没有必要,维护工作量大,下次有新的elua版本,只 .. ( 16:06) 这有个主次问题。如果是原有的C为主,新增的LUA为辅,只需要在原有的C里新增一行类似“LUA_Init();”就能通过命令行快速编辑、执行一些测试动作;正式投产时又可以简单把LUA功能屏蔽掉……应该会很容易流行起来。
UID:1109873
在线时间1116小时
M币6673专家2
&发表于: 昨天 09:27
厉害啊,表示看不懂,老老实实玩arduino吧
这相当于一个简单的dos计算机
UID:1023450
在线时间1723小时
M币1390专家30
&发表于: 昨天 11:01
我用的是这个板子:
本文内容包含图片或附件,获取更多资讯,请
后查看;或者
成为会员获得更多权限
UID:807546
在线时间1858小时
M币1076专家15
&发表于: 昨天 12:27
老大的帖子必须顶
UID:1065587
在线时间1440小时
M币254专家1
&发表于: 15小时前
arduino还没玩好,又放重磅炸弹💣不会玩啊
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
您目前还是游客,请
&回复后跳转到最后一页
Code by , Time now is:07-13 14:23,
Gzip enabled&1958人阅读
eLua体系结构
下图整体概述了eLua的体系结构
eLua使用平台的概念表示一组具有相同内核结构的CPU,尽管这些CPU针对不同的具体外设,内存和其他一些属性分别有特定的实现。一个eLua实现给定平台的一个或多个CPU。比如,eLua的lm3s移植可以运行LMSS8962,LM3S6965,LM3S6918处理器,它们都是lm3s平台下的一部分。从上图可以看出,eLua试着尽可能在不同平台之间使用一些简单的设计规则。
所有代码跟具体平台无关的是通用代码,而且它应该尽可能使用标准C语言书写。这样就可以使它在不同的体系结构和编译器间有高度的可移植性,就像Lua本身一样。所有那些不可能通用的代码(几乎都是外设和具体CPU相关)应该尽可能的使之可移植,通过使用通用接口,这种通用接口要能让eLua能在所有的平台上都能运行。这种接口称为平台接口。所有平台(和它们的外设)不能同等的创建,因为在功能上有巨大的变化。如前所述,平台接口试着组合不同平台的共同特性。如果想在一个给定平台上实现具体的一个功能的话,可以通过使用一个平台模块。这些平台模块是数据特定平台的,它们的目的就是填补平台接口和一个具体平台所提供的所有具体特性之间的缺口。
下面给出了不完整的一些项可以被归类于通用代码。
Lua代码(很明显是)加上LTR补丁所有在eLua的组件(比如ROM文件系统,XMODEM接收代码,eLua shell,TCP/IP栈等等)所有通用模块,这些模块是lua的模块,展示了Lua平台的不同功能。通用外设支持代码,比如ADC支持代码(src/common/elua_adc.c),此代码独立于真实的ADC硬件。libc代码(比如allocators和Newlib)
上述的描述应该会给你一个好的关于通用代码的印象。注意通用代码所占据的层应该尽可能的多,也就是说,应该尽可能的有更多的通用代码。比如如下例子:
如果你想给eLua添加一个新的文件系统,这很清楚应该是通用代码。这就好像代码产生的文件系统与具体依赖相关的物理媒介的处理。如果你幸运的话,你可以使用在平台接口的一些函数解决这种依赖关系。比如通过SPI控制SD卡,因为这个平台拥有SPI层。如果不是那样的话,你必须在一个独立的接口中组合与特定的平台相关的函数,然后实现它让其在所有平台上都能使用这种文件系统。这给了代码最大的移植性。如果你想为特定的ADC外设(此ADC通过SPI工作)添加驱动,那么可以使用如前所述的同样理论,尽你可能的把它写成通用代码,并且使用平台接口中的函数实现你需要的特定的SPI。
当设计和实现一个新的组件时,记住另外一个eLua的设计目标:灵活性。用户应该可以选择在二进制文件里面包含哪些组件,实现的时候就要把这些考虑进去。同样的理论也适用于通用模块:用户能根据需要选择相应的模块。
为了移植性的最大化,尽可能让你的代码工作在各种可能遇到的情景中。这样的例子就如在stdio/stdout/stderr中代码的处理。
代码(src/Newlib/genstd.c),此中代码就承认了这样一个事实,终端可以通过可以多种我物理传输接口实现(RS232,SPI控制的液晶/键盘等等)。所以代码使用指针来处理收和发的函数。这样在速度和资源的消耗上是最小的,但是它关系到重要的移植部分。
运用得当的话,平台接口能允许在不同的平台上书写具有可移植性的代码,包括C和Lua.平台接口的一个重要特性就是它试着组合不同平台下共同特性。比如,一个eLua所支持的平台的串口能工作在回路模式,但是其它平台不能,那么关于回路模式的支持就不能被包括进平台接口里面。
关于平台接口使用的特别的一点是:记住它不但可以用C,还可以用Lua.平台接口主要通过通用模块允许Lua控制平台的外设,但这不是它唯一的用法。如果可能的话也可以用C语言实现一个通用模块而且也能用C控制外设。这个例子就是上面所述的打造一个新的文件系统。
平台接口的定义总是在inc/platform.h头文件里。
平台和移植
所有运行eLua的平台(和i平台接口的实现)都是在它的概念层上实现的。移植就是eLua能在一个给定的平台下运行。
移植应当包括特定的外设驱动,很多时候这都是来自CPU所在平台的支持包。这些驱动用于实现平台接口。注意下面几点:
移植不要实现平台下的所有功能,只是它需要的就够了。也就是说,通过所构建的eLua二进制文件用户能够取得相应的需要控制的部分。如果你不需要SPI模块,你就不需要实现关于它的平台接口。平台接口中的一部分可以在一个文件中实现,让其够工作在所有平台上(src/common.c),这简化了一些模块的设计(比如定时器模块),这样也实现了所绑定平台的通用特性,但在所有平台上也有共同的表现(比如虚拟定时器)。如果你正在写特定平台下代码的话,尽可能不要去修改它,但是最好记住它是干什么的。
一个平台的也许包括一个或多个独立平台的模块。正如已经解释的那样,这样做的目的是让Lua能发挥所有平台相关外设的潜能,而不只是被平台接口覆盖到的外设功能。当然外设具有特定的功能时也不会被归类到平台接口。按照惯例,所有平台的独立模块应该被组合进一个单独的模块,此模块的名字与它本身的平台是一样的。如果一个平台的独立模块增加的功能是平台接口所拥有的,它应该也是相同的名字。否则,应该给它一个不一样的名字。比如:
如果在LM3S平台实现了一个新的功能关于UART模块,那么响应的模块应该被称作lms3s.uart。如果实现了一个特定外设驱动在LPC2888平台下,比如双通道DAC,给它一个特别的名字,比如lpc288x.audiodac.
移植相关结构
所有关于平台名字的代码(包括外设驱动)必须集中在一个叫做src/platform/&name&的文件里(比如src/platform/lm3s就是针对lm3s平台的)。每一个这样的特定于平台的子目录必须包含至少这些文件:
type.h:其中定义的特定的数据类型。下图是关于i386平台下一些数据类型。
typedef unsigned char u8;
typedef signed char s8;
typedef unsigned short u16;
typedef signed short s16;
typedef unsigned long u32;
typedef signed long s32;
typedef unsigned long long u64;
typedef signed long long s64;
conf.py:这是特定平台的构建文件。构建系统会使用此文件,此文件有以下目的:
获得特定平台下将被编译成eLua二进制文件的文件列表。它们通过specific_files字符串加载,空格隔开。而且必须给出相关文件的路径。下面的例子是关于i386平台的:
specific_files = &boot.s common.c descriptor_tables.c gdt.s interrupt.s isr.c kb.c
monitor.c timer.c platform.c&
# Prepend with path
specific_files = & &.join( [ &src/platform/%s/%s& % ( platform, f ) for f in specific_files.split() ] )
为了获得不同工具链单元的所有需要的命令来编译eLua。它们需要被声明在tools变量里。每个独立的字典里的关键字是相应平台的名字,linkcom代码linker,ascom代表assember,比如下面就是关于i386平台工具变量的设置:
# Toolset data
tools[ 'i386' ] = {}
tools[ 'i386' ][ 'cccom' ] = &%s %s %s -march=i386 -mfpmath=387 -m32 -ffunction-sections -fdata-sections -fno-builtin -fno-stack-protector %s -Wall -c $SOURCE -o $TARGET& % ( toolset[ 'compile' ], opt, local_include, cdefs )
tools[ 'i386' ][ 'linkcom' ] = &%s -nostartfiles -nostdlib -march=i386 -mfpmath=387 -m32 -T %s -Wl,--gc-sections -Wl,-e,start -Wl,--allow-multiple-definition -o $TARGET $SOURCES -lc -lgcc -lm %s& % ( toolset[ 'compile' ], ldscript, local_libs )
注意到tools的定义使用到了toolset的定义,toolset是一个包含当前所使用工具名的字典。这也是eLua构建系统的一部分。
为了实现一个可以接收eLua可执行文件的函数(构建步骤的结果),并且产生一个在相应平台上合适的编程文件,这个函数的名字应该被设置进tools字典中,如下所示(关于str7平台的例子代码):
# Programming function for STR7
def progfunc_str7( target, source, env ):
outname = output + &.elf&
os.system( &%s %s& % ( toolset[ 'size' ], outname ) )
print &Generating binary image...&
os.system( &%s -O binary %s %s.bin& % ( toolset[ 'bin' ], outname, output ) )
tools[ 'str7' ][ 'progfunc' ] = progfunc_str7
再一次提醒这个函数使用相同的toolset变量跟上面的一样。
stacks.h:按照惯例,系统所使用的栈空间被声明在这里。下面给出的例子是来自at91sam7x平台下的一段代码:
STACK_SIZE_USR
STACK_SIZE_IRQ
STACK_SIZE_TOTAL ( STACK_SIZE_USR + STACK_SIZE_IRQ )
platform.c:按照惯例,平台接口的实现就在这个文件里。它也包含一些与平台无关的初始化函数。
platform_conf.h:这是关于平台配置的头文件,其中给出了平台本身和构建相关平台的配置信息。从这个文件中,你将看到下列内容:
将要被构建的组件列表将要被构建的模块列表静态配置数据CPU的各种外设的数目,下面的例子代码展示了来自同一平台(lm3s)下不同CPU的外设情况。宏FORXXX被定义在conf.py文件中
// Number of resources (0 if not available/not implemented)
#define NUM_PIO
#define NUM_SPI
#ifdef FORLM3S6965
#define NUM_UART
#define NUM_UART
#define NUM_TIMER
#ifndef FORLM3S6918
#define NUM_PWM
#define NUM_PWM
#define NUM_ADC
特定的外设配置:包括UART使能缓冲,使能和开启虚拟定时器,设置PIO配置等等。内存配置:描述了内存分布区域。此区域将被标准系统分配。两个宏MEM_START_ADDRESS 和MEM_END_ADDRESS定义了空闲RAM的起始地址和结束地址。如果你的板子有外部RAM空间,你也应该在这里定义。如果没有的话,你将只能使用内部内存,并且一般你需要使用链接定义标志end找出你空闲内存从哪里开始,下面的例子来自ATEVK1100(AVR32)开发板,它拥有内部和外部RAM
// Allocator data: define your free memory zones here in two arrays
// (start address and end address)
#define MEM_START_ADDRESS
{ ( void* )end, ( void* )SDRAM }
#define MEM_END_ADDRESS
{ ( void* )( 0x10000 - STACK_SIZE_TOTAL - 1 ), ( void* )( SDRAM + SDRAM_SIZE - 1 ) }
网络配置:如果需要TCP/IP在你的开发板上,你需要向eLua添加网络支持。你也需要另一个叫做uip_conf.h文件用来配置uip以用于你特定的处理器架构。
除了上述那些被要求的文件外,常见的情况是在移植中需要添加跟特定平台相关的文件:
启动文件:一般用汇编书写,做一些低档次的初始化,设置堆栈指针,归零BSS区域,将ROM中DATA区域移动到RAM中,然后跳转到main函数。链接命令文件CPU支持包:一般来自设备制造商,包括的代码有控制外设,配置内核,开启中断等等。
水平有限,如有错误,给出指正。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:354087次
积分:5319
积分:5319
排名:第3307名
原创:172篇
转载:10篇
译文:16篇
评论:108条
阅读:4716
文章:11篇
阅读:36759
(5)(4)(8)(25)(3)(4)(12)(3)(9)(1)(1)(12)(1)(9)(3)(22)(30)(4)(7)(1)(4)(6)(1)(11)(1)(1)(1)(11)}

我要回帖

更多关于 丹弗斯变频器故障代码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信