ICCV8 for R是单片机编辑软件,可以在软件上直接使用R编辑器设计单片机,可以使用“设置/编辑器/颜色”或在编辑器内部单击鼠标右键,单击“配置编辑器”来更改编辑器的颜色,可以在动鼠标的同时按住Contl键来放大和缩小编辑器,支持寻址绝对内存位置,您的程序可能需要解决绝对内存位置,例如外部IO外设通常映到特定的内存位置,这些可能包括LCD接口和双端口SRAM,您也可以在特定位置分配数据,以便在引导加载程序和主应用程序之间或在访问双端口RAM的两个单独的处理器之间进行通信,在项目树中键入内容时,您可以通过按ALT-G轻松地找到/打开文件,每个项目可以有多个构建目标,例如,用于构建库的目标和用于使用该库构建应用程序的目标!
ICCV8 软件功能
访问K范围之外的内存
通过16位指针,R通常可以访问K字节的数据存储器,用于功能的K字程序存储器和用于恒定数据的K字节程序存储器。 后者需要澄清:由于代码必须在字边界上对齐,因此R使用字地址访问代码(例如,用于函数调用)。 这允许函数调用以16位字地址达到Mega128闪存空间的完整128K字节/ K字。 但是,闪存中的常量数据使用字节地址,因此R通常只能使用LPM指令访问闪存低K字节中的常量数据。
为了解决这些限制,R使用RAMPZ IO寄存器来允许对闪存的大于K的访问。 XMega具有四个此类IO寄存器:RAMPX,RAMPY,RAMPZ和RAMPD,以允许对数据和闪存进行大于K的访问。
C任务
如汇编接口和调用约定页面中所述,编译器通常会生成代码以保存和恢复保留的寄存器。在某些情况下,这种行为可能是不希望的。例如,如果您使用的是RTOS(实时作系统),则RTOS会在任务切换过程中管理寄存器的保存和还原,并且编译器插入的代码将变得多余。
引导加载程序应用
一些较新的大型设备支持引导加载程序应用程序。您可以将引导加载程序构建为的应用程序,也可以将单个程序包含主代码和引导加载程序代码。
汇编中断处理程序
您可以在汇编中编写中断处理程序。但是,如果在汇编处理程序中调用C函数,则汇编例程必须保存和恢复易失寄存器,因为C函数不会(除非将它们声明为中断处理程序,否则不应直接调用它们)。
特定的R问题
Atmel提供了各种各样的R设备,它们的内存大小和外围设备有所不同。本节介绍了一些R和设备特定的问题。
R功能
R使用哈佛架构并将程序和数据存储器分开。
程序存储器的大小以字节为单位指定(例如M32具有32K字节的闪存),但每条指令的长度至少为2个字节。因此,指令中编码的程序位置是字地址。当用作文字表等的存储时,程序存储器可使用lpm / elpm指令系列进行字节寻址。
适用于R程序的ICCV8(例如,适当的编译器,汇编器和链接器)在大多数情况下使用字节地址,并且这些工具会根据需要进行适当的字地址转换。
寄存器不是全部通用的。使用立即源作数(例如addi,ldi等)的R指令仅对高16个寄存器R16至R31进行作。只有3组“指针”寄存器:R26 / R27或X,R28 / R29或Y,以及R30 / R31或Z。Y和Z可以使用带偏移量的位移模式,但X不能使用这种模式。
生成的代码使用两个堆栈作为调用返回地址的本机硬件堆栈和使用Y指针的软件堆栈。虽然这使确保两个堆栈都具有足够的空间更具,但是使用单个堆栈的替代方产生更多的代码。
特定于设备的指令
具有8K或更少字节程序存储器的设备不支持jmp和call指令,仅支持rjmp和rcall相对指令。 R的初始生成(有时称为“经典” R)没有更新的指令,例如乘法指令和扩展的lpm指令。
相对跳转/呼叫包装
在具有8K程序存储器的设备上,可以使用相对的跳转和调用指令(rjmp和rcall)到达所有存储器位置。为此,将相对的跳转和调用环绕8K边界。例如,向前跳转到字节位置0x2100(0x2000为8K)被包装到字节位置0x100
功能指针
为了与代码压缩器(tm)完全兼容,所有间接函数引用都必须通过额外的间接级别。如果您通过使用函数指针来调用函数,这将在C中自动为您完成。换句话说,函数指针的行为与预期的一样,只是略慢一些。
C机器程序
大多数C作都转换为直接的Atmel R指令。但是,有些作被转换为子例程调用,因为它们涉及许多机器指令,并且如果以内联方式完成转换,将导致过多的代码膨胀。这些例程以汇编语言编写,并且可以通过以下事实加以区分:例程名称不是以下划线开头或具有两个下划线前缀。这些例程可能使用也可能不使用标准调用约定,并且您不应该直接使用它们,因为我们可能会根据编译器版本来更改它们的名称或实现。
外部SRAM数据存储器
如果选择具有32K或K外部SRAM的设备目标,则堆栈将放置在内部SRAM的顶部,并朝着低内存地址向下生长。数据存储器从硬件堆栈的顶部开始并向上增长。
分配方式有所不同,因为内部SRAM的访问时间比外部SRAM的访问时间快,并且在大多数情况下,将堆栈项目分配给更快的内存更有利
堆栈和堆函数
除了静态程序区域外,C运行时环境还包含两个其他数据区域:堆栈区域和堆区域。堆栈用于过程调用,局部和临时变量以及参数传递。堆用于由标准C malloc(),calloc()和realloc()调用创建的动态分配的对象。要使用堆函数,必须首先初始化堆区域
司机
编译器驱动程序每个输入文件,并根据文件的扩展名和已接收的命令行参数对文件进行作。 .c文件和.s文件分别是C源文件和程序集源文件。 IDE的设计理念是使其尽可能易于使用。但是,命令行编译器非常灵活。您可以通过将命令行参数传递给它来控制它的行为。如果要使用自己的GUI(例如Codewght或Multiedit编辑器)与编译器进行交互,则需要了解以下几点。
编译器参数
IDE通过将命令行参数传递给编译器驱动程序来控制编译器的行为。通常,您不需要知道这些命令行参数的作用,但是在执行构建时,您可以在生成的makefile和“状态窗口”中看到它们。但是,如果您想使用自己的编辑器/ IDE(例如Codewght)来驱动编译器,则此页面记录了TI MSP430 IDE所使用的选项。所有参数都传递给驱动程序,而驱动程序又将适当的参数传递给不同的通道。
MISRA / Lint代码
MISRA C是由MISRA(汽车工业软件可协会)http://www.misra.org.uk开发的C编程语言的编码标准。 MISRA C准则最初旨在提高程序在汽车工业中的安全和可移植,而嵌入式设备的渐流行,如今已被许多组织在汽车工业以外的嵌入式领域采用MISRA C准则。 (如果您熟悉MISRA C,则可以认为它是Lint的超集。)
代码压缩器(tm)
代码压缩器(tm)优化器是最先进的优化程序,可将最终程序大小从5-18%减小。它在我们针对特定目标的编译器的高级版和专业版中可用。它适用于您的整个程序,可在所有文件中搜索减小程序大小的机会。我们比其他任何人都为商业嵌入式编译器提供了这种创新技术。
方便的功能
C:B的一些更有用的功能是:
折叠和展开代码,使显示更整洁。
使用Edit-> …(comment)…注释/取消注释选定的文本块。
使用TAB缩进所选文本的块,并使用shift-TAB缩进。
通过下拉列表(工具箱图标下的行)跳转到任何函数定义。
右键单击一个函数名称,选择以查找其实现或声明。
右键单击源文件上的任意位置,选择“交换头文件/源文件”以打开具有相同名称的头文件。
使用插件->源代码格式化程序(AStyle)格式化源代码。
菜单参考:构建选项-项目
项目类型-仅对高级和专业版本启用。
允许您构建常规可执行文件输出或库文件输出。
Makefile选项-指定在生成的Makefile中使用“相对路径”还是“绝对路径”。
在生成之前执行命令-在生成项目之前执行用户定义的命令。有关C :: B支持的变量的列表,请参见下文。
成功构建后执行命令-成功构建项目后执行用户定义的命令。有关C :: B支持的变量的列表,请参见下文。
R Studio版本(COFF)-指定您使用的R Studio版本。
请注意,Studio 4.0及更高版本允许源文件和COFF文件位于不同的目录中,而Studio 4.06及更高版本可以扩展结构成员
构建选项-路径
包含路径-您可以指定编译器应在其中搜索包含文件的目录。您可以通过使用分号或空格分隔路径来指定多个目录。如果路径包含空格,则将其用双引号引起来。
如果未指定完整路径(即,路径不以或驱动器号开头),则该路径相对于Pject目录(即.cbp文件所在的位置)。
编译器驱动程序会自动将c: iccv8avr include添加到包含路径,因此您无需显式添加它。
汇编器包含路径-您可以指定汇编器应在其中搜索包含文件的目录。您可以通过使用分号或空格分隔路径来指定多个目录。如果路径包含空格,则将其用双引号引起来。
生成选项-编译器
严格-ANSI C是从原始K&R C演变而来的。虽然ANSI C标准比K&R C具有更严格的语言和更严格的类型等,但它仍允许某些可能不安全的作。如果选择此选项,则编译器会警告有关没有原型的函数类型的声明和转换,指向整数的指针和指向枚举的指针之间的分配以及从指针到较小整数类型的转换。它还警告无法识别的控制行,文字中的非ANSI语言扩展和源字符,未引用的变量和静态函数以及声明不完整类型的数组。
此选项通常应为ON,并且应研究所有警告以确保可接受。
ICCV8 软件特色
1、现在为所有增强型核心设备启用“使用ELPM / RAMPZ。
2、添加了8位优化。大多数,如果不是全部可以按照标准C规则合法完成的表达式完成8位作而不是提升的int类型。
3、将大多数程序提高1%到2%甚至更多变量被广泛使用。
4、为AT90USB82和AT90USB162添加了设备条目编译器。
5、编译器将参数寄存器保存到另一个保存的注册而不保存保留的寄存器。
6、这通常只是如果函数没有其他局部变量并且它发生了用参数调用其他C函数。
ICCV8 安装方法
1、打开iccv8avr_8.04.exe开始安装,点击next
2、阅读软件的安装协议,点击accept接受
3、设置软件的安装地址c:iccv8avr
4、设置开始菜单文件夹
5、提示准备安装界面,点击install
6、软件已经安装到电脑,打开主程序开始使用!
ICCV8 使用说明
1、软件界面如图所示,您可以同时打开多个项目
2、每个项目可以有多个构建目标。 例如,用于构建库的目标和用于使用该库构建应用程序的目标
3、代码:: Blocks当前不是C / C ++源文件的默认应用程序。
是否要将其设置为默认值?
以后您始终可以从环境设置中更改关联。
不,保留一切
不,保留一切(但是下次再问我)
是的,将代码:块与C / C ++文件类型相关联
是的,将代码::与每种受支持的类型相关联(包括来自其他IDE的项目文件)
4、提示新项目设计界面,可以选择你需要创建的编辑项目
5、欢迎使用新的GLUT项目向导!
该向导将指导您使用GLUT OpenGL扩展来创建新项目。
当您准备好继续时,请单击“下一步”。
6、请选择要在其中创建新项目的文件夹及其标题。
7、请在计算机上选择GLUT的位置。
这是安装(解压缩)GLUT的顶级文件夹。
为了帮助您,此文件夹必须包含子文件夹“ include”和“ lib”。
8、常规设置
iShow启动时启动屏幕
仅允许一个正在运行的实例(需要重新启动应用程序才能生效)动态数据交换(需要重新启动应用程序才能生效)
使用已经运行的实例而不是启动新实例(如果可能)
把它放在最上面
9、缩略语
自动完成与代码完成插件无关。 通过键入以下关键字之一并按Ctrl-J来调用它。 ,将相应类型的关键字替换为相应的代码。
ICCV8 教程
标准IO功能
由于标准文件IO对于嵌入式微控制器没有意义,因此许多标准stdio.h内容均不适用。尽管如此,仍支持某些IO功能。使用这些功能之前,请使用#include 。您将需要初始化输出端口。最低级别的IO例程由单字符输入(getchar)和输出(putchar)例程组成。您将需要实现这些例程,因为它们专用于目标设备。我们提供示例实现,在大多数情况下,您只需要将正确的示例文件复制到您的项目中即可。请参见下面的功能说明。您不需要修改高级标准IO功能,例如pntf,spntf,scanf等。
在多个输出设备上使用pntf
在多个设备上使用pntf非常简单。您可以编写自己的putchar(),以便根据全局变量和更改此变量的函数将其写入不同的设备。,当您要切换为使用其他设备时,只需调用设备更改功能即可。您甚至可以通过使用vfpntf()函数来实现带有某种设备编号参数的pntf版本,如下所述。
字符串函数
支持以下字符串函数。在使用这些功能之前,请使用#include >。文件定义NULL和typedefs size_t,以及以下字符串和字符数组函数:
void * memchr(void * s,int c,size_t n)搜索大小为n的数组s中c的首次出现。如果找不到匹配项,它将返回匹配元素的地址或空指针。
int memcmp(void * s1,void * s2,size_t n)比较两个数组,每个数组的大小均为n。如果数组相等,则返回0;如果s1中的第一个不同元素大于s2中的对应元素,则返回0。否则,它返回一个小于0的数字。
void * memcpy(void * s1,const void * s2,size_t n)将从s2开始的n个字节复制到s1中。
void * memmove(void * s1,const void * s2,size_t n)将s2复制到s1中,每个大小均为n。即使输入重叠,该例程也可以正常工作。它返回s1。
void * memset(void * s,int c,size_t n)将c存储在大小为n的数组s的所有元素中。返回s。
char * strcat(char * s1,const char * s2)将s2连接到s1上。它返回s1。
char * strchr(const char * s,int c)搜索c在s中的首次出现,包括其终止的空字符。如果找不到匹配项,它将返回匹配元素的地址或空指针。
int strcmp(const char * s1,const char * s2)比较两个字符串。如果字符串相等,则返回0;如果s1中的第一个不同元素大于s2中的对应元素,则返回0。
否则,它返回一个小于0的数字。
int strcoll(const char * s1,const char * s2)使用语言环境比较两个字符串。在我们的编译器下,这与strcmp函数完全相同。
堆栈功能
提供了几个库函数来堆栈溢出。 考虑下面的内存映; 如果硬件堆栈扩展到软件堆栈,则软件堆栈的内容将更改。 这将更改局部变量和其他堆叠项目的值。 由于硬件堆栈用于函数返回地址,所以如果您的函数调用树嵌套太深,则可能会发生这种情况。
同样,溢出到数据区的软件堆栈会修改全局变量或其他静态分配的项(如果使用动态分配的内存,则将修改堆项)。 如果声明太多局部变量或局部聚集变量太大,则可能会发生这种情况。
如果您经常使用函数pntf,那么格式字符串可能会在数据区域中占用大量空间
概括
要使用堆栈功能:
1. #include
2.插入_StackCheck();在您要堆栈是否溢出的代码中。这可能在您代码中的任何位置,例如在看门狗定时器功能中。
3. _StackCheck()检测到堆栈溢出时,它将调用函数_StackOverflowed(),该函数的整数参数值为1表示硬件堆栈已溢出,值为0表示软件堆栈已溢出。
4.默认的_StackOverflowed()库函数跳转到位置0并重置程序。若要更改此默认行为,请在源代码中编写自己的_StackOverflowed函数。这将覆盖默认值。对于程序调试,您的_StackOverflowed函数应该执行某些作以指示难状况,可能是通过闪烁LED来进行。如果使用调试器,则可以在_StackOverflowed函数中设置断点以查看是否被调用。
头文件Rdef.h中列出了这两个函数的原型。
哨兵
启动代码在数据区域上方的地址处写入一个前哨字节,并在软件堆栈上方的地址处写入一个类似字节。如果前哨字节被更改,则说明发生了堆栈溢出。
访问R功能
C的优势在于,尽管它是高级语言,但它允许您访问目标设备的低级功能。 有了这种功能,除了在最优化的代码至关重要的情况下,几乎没有理由使用汇编。 即使在目标功能在C中不可用的情况下,通常也可以使用内联汇编和预处理器宏来透明地访问这些功能。
io ??? v.h头文件
IO寄存器的命名方案,位定义和中断向量在这些头文件中进行了标准化。 io ??? v.h标头文件为R的IO寄存器和位,中断向量号以及锁定/保险丝位(如果支持)定义了符号名(仅适用于Mega R)。 IO寄存器和位名称的定义与数据手册中的规定相同,只有少数例外和扩展名(请注意,摘要页面有时会有拼写错误!)。 文件iccioavr.h有条件地包括所有这些io ???? v.h文件,具体取决于定义的设备宏(由IDE向下传递)。
程序数据和常量存储器
R是哈佛架构机器,将程序存储器与数据存储器分开。这种设计有几个优点。其中之一是,与传统架构相比,单独的地址空间允许R设备访问更多的总内存。在具有非哈佛架构的8位CPU中,它可以寻址的内存最大数量通常为K字节。要在此类设备问超过K字节,通常需要使用某种类型的寻呼方案。使用哈佛架构,Atmel R设备具有多种变体,它们的总地址空间超过K字节,而无需使用分页方案。
不幸的是,C不是在这样的机器上发明的。 C指针既可以是数据指针也可以是函数指针,并且C规则已经指定了您不能假定可以反复转换数据和函数指针。另一方面,
像R这样的哈佛架构机器,数据指针可能指向数据存储器或闪存(程序存储器)中的常量数据。
堆栈
生成的代码使用两个堆栈:子例程调用和中断处理程序使用的硬件堆栈,以及用于为参数,临时变量和局部变量分配堆栈帧的软件堆栈。 尽管看起来很麻烦,但使用两个堆栈而不是一个堆栈可以最透明和代码高效地使用数据RAM。
由于硬件堆栈主要用于存储函数返回地址,因此它通常比软件堆栈小得多。 通常,如果您的程序不是调用密集型的,并且不使用调用密集型库函数(例如%f格式的pntf),则默认的16字节应该可以正常工作。 在大多数情况下,硬件堆栈的最大值为40个字节就足够了,除非您的程序具有深度递归的例程。
全球注册
有时,如果您的程序可以访问全局寄存器,则效率更高。 例如,在中断处理程序中,您可能想增加程序另一部分可能需要访问的全局变量。 由于保存和恢复寄存器的开销以及访问全局变量所在的内存的开销,以这种方式使用常规C全局变量可能比中断处理程序需要更多的开销。
您可以通过选中“编译器”->“选项”->“目标”->“不使用R20..R23”选项,要求编译器不使用寄存器R20,R21,R22和R23。 通常不应该此选项,因为编译器可能会使用较少的寄存器,因此可能会生成较大的程序。 除此设置外,您无法保留其他寄存器。