版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、如何分配变量到指定的地址 举例:unsigned char temp_AOxOO; 左义无符号变量temp_A,强制其地址为0x00 unsigned char temp_B0x100; 龙义无符号变量temp_B,强制其地址为0x100tiny unsigned char temp_C; /;e义无符号变M temp_C,由编译器自动在地址小于0x100 的RAM中为其分配一个地址near unsigned char temp_D;/;E义无符号变量temp_D,由编译器自动在地址大于OxFF 的RAM中为其分配一个地址另外也可以采用伪指令"pragma"将函数或者变量左
2、义到指左的section中,例如:#pragma section name /将下而左义的未初始化变量龙义到.name section中 Unsigned char datal;Un signed int data2;(任何需要定义在.name section中的变蚩:) #pragma section / 返回到正常的 section注意:pragma伪指令可以用来左位函数,初始化变量或者未初始化变量。这三者用不同的 括号区分。(name):代码name:未初始化变量name:初始化变量如何在COSMIC C文件中使用汇编语言在COSMIC C文件中使用汇编语言常见的方法有如下两种:使用#a
3、sm .#endasm组合格 式或_asm("“);单行格式。举例1:unsigned char temp_A;Void fund (void)#asmPUSH ALD A,(X)LD _temp_A,APOP A#endasm 注:在C嵌汇编环境下使用全局变量,要在该全局变量名称前加下划线I”。 举例2:Void fund (void)_asm(nrimM);_asm("nop");如何观察RAM/FLASH/EEPROM的最终分配情况 在 Project->settings->linker选项页中,将Category选为0utput,再勾选Gene
4、rate Map File。Project SettingSettings DebugE ip at45dbxxclnk $ (ToolsetLibOpts) _o$ (OutputFath)$ (TargetSNne). sm8 -mCancelComm andi Generate Error FError FileSymbols sor ted by addiDefaultsUser DefinedLiiJcer Post-Build.AssemblerLogical Address Symb< G Symbols sorted by Alp点击OK按键后,再次编译链接该项目,如果成
5、功则会在项目输出目录中(本例是在C:STM8_NewProject 1 debug目录下)生成.map文件。该文件详细地列出RAM/FLASH/EEPROM的分配使用情况。如何生成hex格式的输出文件在Project->settings->PostBuild选项页中,在commands栏内加入下行命令:chex -fi -o $(OutputPath)$(TargetSName).hex $(0utputPath)$(TargetSName).sm8再次编译链接该项目,如果成功则会在项目输出目录中(本例是在C:STM8_NewProject 1 debug 目录下)生成.hex 文
6、件。什么是 MEMORY MODELSTM8的C编译器支持多种存储器模式。用户可以根据应用的需要选择最适合的配宜。可 以根据需要选择采用2个字节的寻址方式(仅适用于64k以内的程序)或者3字节的寻址 方式。也可以规泄将变量默认为泄义在存储器的哪一区域:zero page内,还是zero page 外。下而对几种供选择的MEMORY MODEL做简单说明。在 Project->settings->C Compiler选项页中,将Category 选为 General,里面有一个 Memory Models选项栏如下:在下拉菜单中共有4种MEMORY MODEL可供选择: 程序地址空间
7、在64K以内(即程序容量小于32K)modsO,modslO 程序地址哦那个键在64K以上(即程序容量大于32K)modsmodslMODSOMODSLOMODSMODSL名称Stack Short 短堆栈模式Stack Long 长堆栈模式Stack Short 短堆栈模式Stack Long 长堆栈模式程序地址空间程序所川到的地址空间在64K范国内程序所用到的地址空间超出64K范国指针默认类型函数指针和数据指针默认为near (2 bytes)函数指针默认为3(地址为3字节): 数据指针默认为near全局变量默认 类型所有全局变量的地址默 所有全局变疑默认为 所有全局变虽的地址默 所有全局
8、变量默认 认为1个字节。对于地址Long型。若要将变量地认为1个字节。对于地址Long型。若要将变 超出1个字节的变量,必址泄义为1个字节,必须超岀1个字节的变量,必址泄义为1个字节, 须用near 义 |ffltiny定义| 须HJnear定义 ffltiny疋义Ikf文件的作用.Ikf文件在程序链接时决圧如何具体分配RAM/ROM的空间。在Project Settings - Linker- Category(lnput)选项页中,当"Auto”选择框被选中时,由系统自动生成LKF文件,否则由用户指左。当"Auto"选择框被勾选时,.lkf文件会自动生成在项目
9、主目录下的debug/和release/目录 中。下而以上图所示at45DBXX Project的Ikf文件为例,来进一步理解kf。在.Ikf中,以”#"开头的行是注释行,为方便用户理解,将原注释删除,代之以中文注释如下: #泄义(+seg)个常量段(.const),开始(b)于0X8080,最大分配(m)0x1ff80个字肖(即不超 过#0x27FFF),为该段起需(n)为.const(和常量段的保留字同名),需要初始化的变呈的初始值 存#放于此段(-it)+seg .const -b 0x8080 -m Ox Iff 80 -n .const -it#宦义(+seg)个程序段(.
10、text),紧跟(-a)在.const段后而(和.const共同位于0x8080-# 0X27FFF),为该段起名(n)为.text (和程序段的保留字同名)。+seg .text -a .const -n .text#左义(+seg)个EEPROM段(.eeprom),开始(b)于0x4000,最大分配(m)0x800个字节(即 不超#过0X47FF),为该段起0n)为.eeprom (和EEPROM段的保留字同名)。+seg .eeprom -b 0x4000 -m 0x800 -n .eeprom# .bsct段服务于定义在0页(地址小于0x100)以内需要初始化的全局变量(如tiny
11、char a = 9;)+seg .bsct -b 0x0 -m 0x100 -n .bsct# .ubsct段服务于左义在0页(地址小于0x100)以内不需要初始化的全局变量(如tiny char b;)+seg ubsct -a .bsct n .ubsct#bit表示位域段,左义后即可在程序中使用_Bool变量(如_Boolc = 1;),id表示该段需要 初始化。+seg .bit -a .ubsct -n .bit -id#这是ST7时代(STMS是基于ST7发展而来的)由于物理堆栈小,速度慢,使用内存来模 拟堆栈的变通手段。+seg .share -a .bit -n .share
12、 -is# .data段服务于左义在0页(地址大于OxFF)以外需要初始化的全局变量(如near char d = 8;)+seg .data -b 0x100 -m 0x1300 -n .data# .bss段服务于泄义在0页(地址大于OxFF)以内不需要初始化的全局变虽:(如 near char e;) +seg .bss -a .data -n .bss#段左义结束,下面放置的库及Obj文件中的变量、常量、程序就按照上而的规定进行分 配。#初始化程序crtsi0.sm8#用户程序Debugmai n.o# 些必要的cosmic库libis0.sm8libm0.sm8#重左义常量段,开始于
13、0x8000,用于放宜中断向量表(STM8硬件决泄此位置)#-k用于程序冗余代码优化,详情可参考cosmic用户手册。+seg .const -b 0x8000 -k#中断向量Debugstm8_i ntenupt_vector.o#定义了三个玉呈:,用于系统初始化+def _endzp=.ubsct # end of uninitialized zpage+def _memory=.bss # end of bss segment+def _stack=0x17ff #不同的芯片_stack内容不同,由系统自动生成如何实现位操作Cosmic C编译器支持位变量的操作,可以将苴定义成_Bool
14、类型。_Bool类型的变屋只包 含两种值true (1)或者false (0)。若将一个表达式赋值给_Bool变量,则编译器会将表 达式与0做比较,然后将布尔值赋给_Bool变疑。因此,任何虽型或者表达式的值都可以赋 给_Bool变量。但是,布尔变量不能泄义位数组,只能左义成结构体或者联合。而且,_Bool 变量会被打包成字节的形式。编译器会将所有的全局_Bool变量打包成字节形式,存放在.bit section中。局部_Bool变量 也会被打包成字节形式。但是_Bool类型的参数会被扩展成一个单字节。具体的关于位变疑的泄义和使用可参考如下例子:定义位变量:_Bool in_range;_Bo
15、ol p_valid;char *ptr;使用位变屋:in_range = (value >= 10) && (value <= 20); p_valid = ptr; r p_valid is true if ptr not 0 7 if (p_valid && in_在使用位变量时,若程序编译时提示如下错误:#error clnk Debugexamplekf:1 no default placement for segment .bitThe command: ”clnk -lMM -o Debugexample.sm8 mDebugexamp
16、le.map sa DebugexamplekfM has failed, the returned value is: 1 exit code=1.实际上是由于,在项目中没有圧义.bitsection.可按照如下步骤,手工添Jn.bitsection: 打开项目链接配置窗口: Project - Settings - Linker,选择Input目录项Project Setting字ttings DebugAssembler Pre-Link Linker | Post-BuildjJLr田毎at45dbxxComm andCategory InputGeneralLk£ Scri
17、wJRMBjDef axil tsSegnint/Section nMGFromT。Opt. . |+ Code. Cons touts0x80800x2.-.X * j 7 - '"+ E Eprom0x40000x47f£* Zero Page0x0Oxff+ Ram0x1000xl3f£|stm8 interfuptor. cjargetSUSemi Autc |pVector addr. 丄|0x8000rVector 骚賦clnk $ (ToolsetLibOpts)$ (OutputPath)$ (TargetSliame). sm8 fOKCancelProject Setti ngs字ttings IDebugAssembler I Pre-Link Linker Post-Build±12JDefaultsC$tegory |pnput3LkF Script |$ (OutputFath)$ (Ta
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 保险理赔处理与风险管理手册(标准版)
- 城市公共交通运营安全管理手册
- 电信网络安全防护与应急响应指南
- 衣康酸预处理分离杨木半纤维素及其衍生糖的溶出动力学研究
- 电信市场营销与客户服务指南(标准版)
- 某污水处理厂台面规范
- 某污水处理厂用气安全规范
- 某针织厂维修工制度
- xx电池厂奖励办法
- 昏迷患者气道护理的并发症处理
- 幼儿园扭扭棒教学课件
- 幼儿园区域材料投放讲座
- 建筑工程商务经理管理培训
- 宪法学第二版马工程课件
- 产科危急重症早期识别中国专家共识(2024年版)解读
- DB32/T 4502-2023企业质量文化建设评价规范
- 团体标准解读及临床应用-成人经鼻高流量湿化氧疗技术规范2025
- 第五章 当代世界教育思潮课件
- 大学课程《国际货物运输与保险》实训大纲
- 进馆档案培训课件
- T-JSQX 0015-2024 电动汽车超级充电站建设技术规范
评论
0/150
提交评论