
ARM开发总结的小知识3000字.docx
12页ARM开发总结的小知识3000字 ARM开发总结的小知识字节 8位半字 16位字 32位Code, RO-dataRW-data,ZI-dataCode为程序代码部分RO-data 表示 程序定义的常量 const temp;RW-data 表示 已初始化的全局变量ZI-data 表示 未初始化的全局变量Program Size: Code="18248" RO-data=320 RW-data=260 ZI-data=3952Code, RO-data,RW-data ..............flashRW-data, ZIdata...................RAM初始化时RW-data从flash拷贝到RAM生成的map文件位于list文件夹下 (KEIL)Total RO Size (Code + RO Data) 18568 ( 18.13kB)Total RW Size (RW Data + ZI Data) 4212 ( 4.11kB)Total ROM Size (Code + RO Data + RW Data) 18828 ( 18.39kB)ARM指令的长度刚好是1个字(分配为占用4个字节),Thumb指令的长度刚好是半字(占用2个字节)R0-R15 (R15-PC,R14-LR,R13-SP) 32位每个异常模式还带有一个程序状态保存寄存器 (SPSR),它用于保存在异常事件发生之前的CPSRLDMIA R1!,{R2-R7, R12} ;将R1单兀中的数据读出到R2-R7,R12, R1自动加1STMIA RO!,{R3-R6,R10} ;将R3-R6,R10中的数据保存到RO指向的地址,RO自动加1在数据传送之前,将偏移量加到Rn中,其结果作为传送数据的存储地址.若使用后缀“!”,则结果写回到Rn中,且Rn值不允许为R15.指令举例如下:LDR Rd, [Rn, #Ox4]!LDMFD SP!,{R0-R3,PC}^ ;中断返回“^”符号表示这是一条特殊形式的指令。
这条指令在从存储器中装载PC的同时(PC是最后恢复的),CPSR也得到恢复大端格式(Big-endian)小端格式(Little-endian)数据0x12345678存储格式大端格式低地址<----0x12|0x34|0x56|0x78---->高地址小端格式低地址<----0x78|0x56|0x34|0x12---->高地址ARM微处理器支持7种运行模式,分别为: CPSR M[4:0]用户模式(usr):ARM处理器正常的程序执行状态 10000快速中断模式(fiq):用于高速数据传输或通道处理 10001外部中断模式(irq):用于通用的中断处理 10010管理模式(svc):操作系统使用的保护模式 10011数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护10111系统模式(sys):运行具有特权的操作系统任务 11111定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真 11011ARM正常工作一般工作在用户模式和系统模式,复位的时候进入管理模式对于ARM指令集来说,PC指向当前指令的下两条指令的地址注意pc,在调试的时候显示的是当前指令地址,而用mov lr,pc的时候lr保存的是此指令向后数两条指令的地址假设反汇编代码: 0x000001 : mov lr pc(此时查看PC寄存器的值是0x000001,但实际PC值是0x000003, lr里面保存的就是0x000003)fields 指定传送的区域(psr CPSR或SPSR)c 控制域屏蔽字节(psr[7..0])x 扩展域屏蔽字节(psr[15..8])s 状态域屏蔽字节(psr[23..16])f 标志域屏蔽字节(psr[31..24])例如:MSR cpsr_c, #0xD3 ; CPSR[7...0] = 0xD3CODE SIZE, RO DATA, RW DATA, ZI DATA, idata, pdata---project Map 文件解读(一) optimization project时,开始往往是关注一时间性能,如codec mips或MCPS等。
当时间性能达到了要求时,往往还会加入size这一参数来作比较,这时就要考虑各种各样的size这一性能参数可能在project requirements book中有明显的说明,在test performance result或在release note中也有更加准备的数据记录如下表:Program ROMXX Data RAM Scratch XX Stack XX Static XX ROM Table XX首先我们要弄清楚这些size的含义以及所反应的性能意义1、CODE SIZE, RO DATA, RW DATA, ZI DATA上面这些变量是在ARM 开发环境下会出现的数值,可以在armlink中加一些参数,得到相应有.map文件,从中就能准确的获取这些值,有一篇文章详细说明这些含义:ARM程序(指在ARM系统中正在执行的程序,而非保存在ROM中的bin文件)的组成 一个ARM程序包含3部分:RO段,RW段和ZI段RO是程序中的指令和常量RW是程序中的已初始化变量ZI是程序中的未初始化的变量由以上3点说明可以理解为:RO就是readonly,RW就是read/write,ZI就是zeroARM映像文件的组成所谓ARM映像文件就是指烧录到ROM中的bin文件,也成为image文件。
以下用Image文件来称呼它Image文件包含了RO和RW数据之所以Image文件不包含ZI数据,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可包含进去反而浪费存储空间Q:为什么Image中必须包含RO和RW?A:因为RO中的指令和常量以及RW中初始化过的变量是不能像ZI那样“无中生有”的 ARM程序的执行过程从以上两点可以知道,烧录到ROM中的image文件与实际运行时的ARM程序之间并不是完全一样的因此就有必要了解ARM程序是如何从ROM中的image到达实际运行状态的 实际上,RO中的指令至少应该有这样的功能:1. 将RW从ROM中搬到RAM中,因为RW是变量,变量不能存在ROM中2. 将ZI所在的RAM区域全部清零,因为ZI区域并不在Image中,所以需要程序根据编译器给出的ZI地址及大小来将相应得RAM区域清零ZI中也是变量,同理:变量不能存在ROM中在程序运行的最初阶段,RO中的指令完成了这两项工作后C程序才能正常访问变量否则只能运行不含变量的代码说了上面的可能还是有些迷糊,RO,RW和ZI到底是什么,下面我将给出几个例子,最直观的来说明RO,RW,ZI在C中是什么意思。
第二篇:form开发的小总结 2600字4. 在FORM中设置某个Item在某个条件下显示时:在form 级trigger when_new_form_instance中加入如下代码:If :parameter.p_select =’ENABLE’ thenApp_item_property.set_property(‘Block_Name.Item_Name1’,visible,Property_On); ElseApp_item_property.set_property(‘Blocke_Name.Item_name1’,visible,Property_Off); End if;5. Go_block()L_where :=’Item_Name=:Paramter.item_name1’;Go_block(‘Block_name’);Set_block_property(‘block_name’,Default_where,L_where||’Order byitem_name2’);Execut_Query;go_block('block_name');first_record;loopif :block_name.item_name1 ='Y' and :block_name.item_name2 is null then :block_name.item_name3 := :parameter.p_refno ; commit; end if; exit when :system.last_record='TRUE'; next_record;end loop;6. calendar日历设置--其实在以前我的form开发技术中已经说过了设置item的lov属性(calendar)务必在validate from list 处选择no在Item trigger : Key_listval 中写上 calendar.show;Calendar.show 是可以带参数的,缺省就是当天(可以打开attached libraries ? appdaypk ? calendar),其参数就是设日历的缺省dateFor example : calendar.show(to_date(‘20xx-08-29’,’YYYY-MM-DD’));7.在form调用window的例子对于包含多个window的form在已打开的window上通过按钮打开另一个window BeginShow_window(‘TEST_WINDOW’,2,2);Set_window_property(‘TEST_WINDOW’,title,’标题’);End;8.fnd_message.questionDeclarev_num number;BeginFnd_message.set_string('确定执行此操作吗?');v_num := fnd_message.question('否', '是', 1, 2);if v_num = 2 thenfnd_message.debug('選擇了是');elsif v_num = 1 thenfnd_message.debug('選擇了否');end if;end;9.实现lov可自动录入内容在item level 的when_new_item_instance trigger上加入BeginSet_item_property(‘block.item1’,validate_from_list,property_false); End;在item level的when_validate_item trigger上加入If :block_name.item_name is not null thenBeginSelect item_name into :block_name.item_nameFrom table_name where ..... and item_name = :block_name.item_name Exception when others thenFnd_message.debug(‘......’);End;End if;10. 在form中创建一个item,用于加总另一个item的值(1)首先创建的Item必须与要统计值的Item在同一个block上。
