浅析STVD(COSMIC)定义变量及其位定义

发布者:ping777最新更新时间:2020-08-11 来源: elecfans关键字:STVD  COSMIC  定义变量  位定义 手机看文章 扫描二维码
随时随地手机看文章

  如何分配变量到指定的地址

  举例:

  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_NewProject1debug 目录下)生成 .map 文件。该文件详细地列出RAM/FLASH/EEPROM的分配使用情况。


  如何生成hex格式的输出文件

  在Project-》settings-》PostBuild选项页中,在commands栏内加入下行命令:

  chex –fi -o $(OutputPath)$(TargetSName).hex $(OutputPath)$(TargetSName).sm8

  再次编译链接该项目,如果成功则会在项目输出目录中(本例是在C:STM8_NewProject1debug 目录下)生成 .hex 文件。

  什么是MEMORY MODEL

  STM8的C编译器支持多种存储器模式。用户可以根据应用的需要选择最适合的配置。可以根据需要选择采用2个字节的寻址方式(仅适用于64k以内的程序)或者3字节的寻址方式。也可以规定将变量默认为定义在存储器的哪一区域:zero page内,还是zero page 外。下面对几种供选择的MEMORY MODEL做简单说明。


  在Project-》settings-》C Complier选项页中,将Category选为General,里面有一个Memory Models选项栏如下:

  浅析STVD(COSMIC)定义变量及其位定义

  在下拉菜单中共有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

  #用户程序

  Debugmain.o

  …

  # 一些必要的cosmic库

  libis0.sm8

  libm0.sm8

  # 重定义常量段,开始于0x8000,用于放置中断向量表(STM8硬件决定此位置)

  # –k 用于程序冗余代码优化,详情可参考cosmic用户手册。

  +seg .const -b 0x8000 –k

  # 中断向量

  Debugstm8_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 Debugexample.lkf:1 no default placement for segment .bit

  The command: “clnk -l”C:Program FilesCOSMICCXSTM8_16K_4.2.10Lib“ -o Debugexample.sm8 -mDebugexample.map -sa Debugexample.lkf ” has failed, the returned value is: 1

  exit code=1.

  实际上是由于,在项目中没有定义.bit section。可按照如下步骤,手工添加.bit section:

  打开项目链接配置窗口:Project - Settings - Linker,选择 Input 目录项

  在Zero page 或者 Ram 里面定义一个.bit section.

  然后重新编译一下就可以了。

关键字:STVD  COSMIC  定义变量  位定义 引用地址:浅析STVD(COSMIC)定义变量及其位定义

上一篇: 基于使用STM8单片机I2C方式实现读写操作
下一篇:STM8单片机按键检测电路设计

推荐阅读最新更新时间:2024-11-10 08:08

STVD+COSMIC工程搭建
  一、寄存器开发方式   1)新建工程文件夹stm8_template,在工程文件夹下新建三个子文件夹,FwLib用于存放固件库,寄存器开发方式下存放芯片的头文件,Project用于建立工程文件,User用于存放我们自己编写的.h和.c文件,所以User文件夹下另外建立inc和src文件夹;   2)打开STVD开发软件,点击左上角File,再点击New Workspace,在弹出的对话框中选择第一项,点击确定;   3)接下来填入工程文件名称,并设置相关路径为刚刚新建的文件夹stm8_template下的Project文件夹,点击OK;   4)接下来再次填入工程名称,无需再次设置路径,在Toolchain下拉选
[单片机]
<font color='red'>STVD</font>+<font color='red'>COSMIC</font>工程搭建
STM32如何定义变量到FLASH ROM中
看逻辑地址是否统一编址。 FLASH,RAM在同一个逻辑地址空间的,都是直接用用const,如arm,stm8,msp430等。 FLASH,RAM逻辑地址空间分开的,要用其它办法,通常是特殊关键字,__flash,__code等。 如AVR,8051等。 注:const本身并没有flash的意思。 如果flash,ram逻辑地址统一编址,那么编译器把全局或静态const变量分配到FLASH,RAM都可以。 为了节省ram,通常编译器会把全局或静态const变量分配到FLASH。 如果flash,ram逻辑地址分开编址,那么全局或静态const变量只能放到ram所在的逻辑地址空间,而无法放到FLASH。 注:逻辑地址统一编址,可以
[单片机]
STVD环境下开发STM8
STVD编译好工程后,不知道在哪里查固件占用的FLASH、EEPROM、RAM情况,很不方便,查阅了相关资料后,终于找到一个简单高效的方法,亲测可用! 1、首先需要下载一个第三方工具,详见:https://download.csdn.net/download/hb69222/11762145 2、将上面的软件放在COSMIC编译软件的安装目录 默认的是C:Program FilesCOSMICCXSTM8 3、打开一个stm8工程,右键选择stm8l工程名,在弹出的快捷菜单中选择Setting选项,在弹出的工程选项设置中找到post-build选项 卡,在commands输入框中增加一行:size $(Outpu
[单片机]
STM8之STVD的使用
如何分配变量到指定的地址 举例: 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中,例如:
[单片机]
STM8之<font color='red'>STVD</font>的使用
STVD配置
按以下图配置 1,编译器配置 2,调试配置 3, 4, 5, 6, 7, 8, 9,出现如下错误 #error clnk lkfmicrobus_pro.lkf:1 no default placement for segment .fcode #error clnk lkfmicrobus_pro.lkf:1 no default placement for segment .FLASH_CODE #error clnk lkfmicrobus_pro.lkf:1 no default placement for segment .iapconst The command: clnk -l
[单片机]
<font color='red'>STVD</font>配置
IAR 编程器 STM8S 脚位的定义
多余的就不说了,都明白,为了方便操作,我们常常会用到类似于LED1 = 1来点亮一个灯,此处LED1就是一个脚位,它当然不是系统自带,一般都是我们宏定义一个脚位。 昨天刚接触IAR这个编程器,想用类似的方法来操作,但是类似51内核操作(keil中写法) sbit LED1 PA0 ; STVD 中的 _Bool PA0_OUT @PA_ODR:0; 这是头有点大,一方面想着操作能方便点,一方面又不想折腾太多时间。 经过一番折腾,最后还是选择通过位操作结合宏定义来操作,具体如下: GPIO_PIN_0 = ((u8)0x01), /*! Pin 0 selected */ GPIO_PIN_1 = ((u8)
[单片机]
STM8编译器最快配置方法(STVD+COSMIC
STM8想用C语言编程,很多人都是用的STVD+COSMIC 对于软件的安装破解什么的,网上搜搜有一大堆,这里就不解释了 这里说说STVD的编译的事情,STVD本身只支持汇编语言,想用C还得借助COSMIC,所以一些设置是必须的,就是在STVD下面选择COSMIC的编译文件(这个根据软件版本自行设置),下图用我的举例 单单是把两个软件安装好,编译路径配置好,编译的时候肯定还会出现STM8官方头文件找不到的错误,网上也有解决办法,就是要把头文件复制到自己的工程下,在工程下面把头文件添加进来,这样每个工程都得弄一次,实在是麻烦 哥哥我后来就想,既然是COSMIC编译的,那何不直接将头文件搞到COSMIC的安装路径下,以我的举例,我
[单片机]
STM8编译器最快配置方法(<font color='red'>STVD</font>+<font color='red'>COSMIC</font>)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved