怎么分配变量到指定的地址
举例:
unsigned char temp_A@0x00; //界说无符号变量temp_A,强制其地址为0x00
unsigned char temp_B@0x100; //界说无符号变量temp_B,强制其地址为0x100
@tiny unsigned char temp_C; //界说无符号变量temp_C,由编译器主动在地址小于0x100的RAM中为其分配一个地址
@near unsigned char temp_D; //界说无符号变量temp_D,由编译器主动在地址大于0xFF的RAM中为其分配一个地址
别的也能够选用伪指令“pragma”将函数或许变量界说到指定的secTIon中,例如:
#pragma secTIon [name] // 将下面界说的未初始化变量界说到.name secTIon中
Unsigned char data1;
Unsigned int data2;
……(任何需求界说在.name secTIon中的变量)
……
#pragma section [] // 返回到正常的section.
留意:pragma伪指令能够用来定位函数,初始化变量或许未初始化变量。这三者用不同的括号区别。
(name):代码
[name] :未初始化变量
{name}:初始化变量
怎么在COSMIC C文件中运用汇编语言
在COSMIC C文件中运用汇编语言常见的办法有如下两种:运用#asm …#endasm组合格局
或_asm(“…”); 单行格局。
举例1:
unsigned char temp_A;
Void func1(void)
{
。..
#asm
PUSH A
LD A,(X)
LD _temp_A,A
POP A
#endasm
。..
}
注:在C嵌汇编环境下运用大局变量,要在该大局变量称号前加下划线“_”。
举例2:
Void func1(void)
{
。..
_asm(“rim”);
_asm(“nop”);
。..
}
怎么调查RAM/FLASH/EEPROM的终究分配情况
在Project-》settings-》linker选项页中,将Category选为Output,再勾选Generate Map File。
点击OK按键后,再次编译链接该项目,假如成功则会在项目输出目录中(本例是在C:\STM8_NewProject1\debug 目录下)生成 .map 文件。该文件详细地列出RAM/FLASH/EEPROM的分配运用情况。
怎么生成hex格局的输出文件
在Project-》settings-》PostBuild选项页中,在commands栏内参加下行指令:
chex –fi -o $(OutputPath)$(TargetSName).hex $(OutputPath)$(TargetSName).sm8
再次编译链接该项目,假如成功则会在项目输出目录中(本例是在C:\STM8_NewProject1\debug 目录下)生成 .hex 文件。
什么是MEMORY MODEL
STM8的C编译器支撑多种存储器方式。用户能够依据运用的需求挑选最适合的装备。能够依据需求挑选选用2个字节的寻址方法(仅适用于64k以内的程序)或许3字节的寻址方法。也能够规则将变量默以为界说在存储器的哪一区域:zero page内,仍是zero page 外。下面临几种供挑选的MEMORY MODEL做简略阐明。
在Project-》settings-》C Complier选项页中,将Category选为General,里边有一个Memory Models选项栏如下:
在下拉菜单中共有4种MEMORY MODEL可供挑选:
程序地址空间在64K以内(即程序容量小于32K)
mods0,
modsl0
程序地址哦那个键在64K以上(即程序容量大于32K)
mods
modsl
MODS0MODSL0MODSMODSL
称号Stack Short
短仓库方式Stack Long
长仓库方式Stack Short
短仓库方式Stack Long
长仓库方式
程序地址空间程序所用到的地址空间在64K规模内程序所用到的地址空间超出64K规模
指针默许类型函数指针和数据指针默以为@near (2 bytes)函数指针默以为@far(地址为3字节);
数据指针默以为@near
大局变量默许类型一切大局变量的地址默以为1个字节。关于地址超出1个字节的变量,必须用@near界说一切大局变量默以为Long型。若要将变量地址界说为1个字节,必须用@tiny界说一切大局变量的地址默以为1个字节。关于地址超出1个字节的变量,必须用@near界说一切大局变量默以为Long型。若要将变量地址界说为1个字节,必须用@tiny界说
.lkf 文件的效果
.lkf文件在程序链接时决议怎么详细分配RAM/ROM的空间。在Project Settings – Linker – Category(Input)选项页中,当“Auto”挑选框被选中时,由体系主动生成.LKF文件,否则由用户指定。
当“Auto”挑选框被勾选时,.lkf文件会主动生成在项目主目录下的 debug/ 和 release/ 目录中。下面以上图所示 at45DBXX Project的 lkf 文件为例,来进一步了解.lkf 。
在.lkf中,以“#”最初的行是注释行,为便利用户了解,将原注释删去,代之以中文注释如下:
# 界说(+seg)一个常量段(.const),开端(b)于0x8080,最大分配(m)0x1ff80个字节(即不超越
# 0x27FFF),为该段起名(n)为.const(和常量段的保留字同名),需求初始化的变量的初始值存
# 放于此段(-it)
+seg .const -b 0x8080 -m 0x1ff80 -n .const -it
# 界说(+seg)一个程序段(.text),紧跟(-a)在.const段后边(和.const 一起坐落0x8080 –
# 0x27FFF),为该段起名(n)为。 text (和程序段的保留字同名)。
+seg .text -a .const -n .text
# 界说(+seg)一个EEPROM段(.eeprom),开端(b)于0x4000,最大分配(m)0x800个字节(即不超
#过0x47FF),为该段起名(n)为。 eeprom (和EEPROM段的保留字同名)。
+seg .eeprom -b 0x4000 -m 0x800 -n .eeprom
# .bsct段服务于界说在0页(地址小于0x100)以内需求初始化的大局变量(如@tiny 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变量(如_Bool c = 1;),-id表明该段需求初始化。
+seg .bit -a .ubsct -n .bit -id
# 这是ST7年代(STM8是根据ST7开展而来的)因为物理仓库小,速度慢,运用内存来模仿仓库的变通手法。
+seg .share -a .bit -n .share -is
# .data段服务于界说在0页(地址大于0xFF)以外需求初始化的大局变量(如@near char d = 8;)
+seg .data -b 0x100 -m 0x1300 -n .data
# .bss段服务于界说在0页(地址大于0xFF)以内不需求初始化的大局变量(如@ near char e;)
+seg .bss -a .data -n .bss
# 段界说完毕,下面放置的库及Obj文件中的变量、常量、程序就依照上面的规则进行分配。
#初始化程序
crtsi0.sm8
#用户程序
Debug\main.o
…
# 一些必要的cosmic库
libis0.sm8
libm0.sm8
# 重界说常量段,开端于0x8000,用于放置中断向量表(STM8硬件决议此方位)
# –k 用于程序冗余代码优化,概况可参阅cosmic用户手册。
+seg .const -b 0x8000 –k
# 中断向量
Debug\stm8_interrupt_vector.o
#界说了三个变量,用于体系初始化
+def __endzp=@.ubsct # end of uninitialized zpage
+def __memory=@.bss # end of bss segment
+def __stack=0x17ff # 不同的芯片__stack内容不同,由体系主动生成
怎么完成位操作
Cosmic C 编译器支撑位变量的操作,能够将其界说成 _Bool类型。_Bool类型的变量只包括两种值true(1)或许false(0)。若将一个表达式赋值给_Bool变量,则编译器会将表达式与0做比较,然后将布尔值赋给_Bool变量。因而,任何整型或许表达式的值都能够赋给_Bool变量。可是,布尔变量不能界说位数组,只能界说成结构体或许联合。并且,_Bool变量会被打包成字节的方式。
编译器会将一切的大局_Bool变量打包成字节方式,存放在.bit section中。部分_Bool变量也会被打包成字节方式。可是_Bool类型的参数会被扩展成一个单字节。
详细的关于位变量的界说和运用可参阅如下比如:
界说位变量:
_Bool in_range;
_Bool p_valid;
char *ptr;
运用位变量:
in_range = (value 》= 10) && (value 《= 20);
p_valid = ptr; /* p_valid is true if ptr not 0 */
if (p_valid && in_
在运用位变量时,若程序编译时提示如下过错:
#error clnk Debug\example.lkf:1 no default placement for segment .bit
The command: “clnk -l”C:\Program Files\COSMIC\CXSTM8_16K_4.2.10\Lib“ -o Debug\example.sm8 -mDebug\example.map -sa Debug\example.lkf ” has failed, the returned value is: 1
exit code=1.
实际上是因为,在项目中没有界说.bit section。可依照如下过程,手艺增加.bit section:
翻开项目链接装备窗口:Project – Settings – Linker,挑选 Input 目录项
在Zero page 或许 Ram 里边界说一个.bit section.
然后从头编译一下就能够了。