STM8使用----STVD(COSMIC)定义变量指定其类型和位定义

发布者:暗里著迷最新更新时间:2018-09-08 来源: eefocus关键字:STM8  STVD  定义变量  类型  位定义 手机看文章 扫描二维码
随时随地手机看文章

STM8使用----STVD(COSMIC)定义变量指定其类型和位定义
http://www.51hei.com/bbs/dpj-31009-1.html
(出处: 单片机论坛)

stm8 stvd下

near等于51的xdata

tiny等于51的idata


如何分配变量到指定的地址
举例:
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


MODS0

MODSL0

MODS

MODSL

名称

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.                

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


关键字:STM8  STVD  定义变量  类型  位定义 引用地址:STM8使用----STVD(COSMIC)定义变量指定其类型和位定义

上一篇:STM8变量的存储
下一篇:STM8L的RAM与内存模型

推荐阅读最新更新时间:2024-03-16 16:13

搏计电子——可提供多种类型电源产品测试系统
在本次的cite 2017中国电子展会上,博计带来的新产品主要有:6010 Charger/Adapter/LED Driver自动测试系统、精密电流分流器7550A、10000A以及数位化功率表GPIB 4010A系列。下面就随测试测量小编一起来了解一下相关内容吧。 博计6010自动测试系统可满足多种类型之电源产品测试需求,可以同时一次测试多个待测物,大幅提升生产线产能。其具有多个模组组合,包含独创的内含Trica模拟输出功能的低杂讯类比式交流电源供应器。   图注1 6010 Charger/Adapter/LED Driver自动测试系统 博计的精密电流分流器7550A可用来校验室电流标准器测量电流从1uA~250
[测试测量]
STVD弹出"Line number 50 is out of range for "main.c"."的原因及解决办法
正在用STVD+Cosmic 32K的免费编译器调试代码,结果弹出这么一个窗口,如下图: STVD Visual Develop : Line number 50 is out of range for main.c . 其实就是无法设置断点。 检查了一下,发现是第 48行代码有问题,B_UART3_Rx_OK 是个位变量,我直接让它与 5 做比较是不对的,于是凡是在这个错误下方设置断点,均会弹出这个窗口,把这条语句改为:if(B_UART3_Rx_OK == 1) 就木有问题了。
[单片机]
<font color='red'>STVD</font>弹出
电能表的作用和类型
电能表是专门用来测量电能的仪表,由于电能的单位是度和千瓦·时,所以电能表又叫电度表或千瓦时表。电能表之所以能测量电能,是因为它的内部有一个计度器也叫积算仪,它能把负载在某一段时间内消耗的电能自动累计起来。 目前,交流电能的测量大多采用感应式电能表,这种仪表的转动力矩大,成本低,是一种应用广泛的仪表。 (1)按电能表的结构及工作原理不同,可分为感应式机械电能表和数字式电能表两种,其中感应式机械电能表数量多,应用最广。 (2)按电能表测量的相数不同,可分为单相电能表和三相电能表。目前,家庭用户基本是单相电能表,工业动力用户通常是三相电能表。
[测试测量]
工业机器人有哪些类型?如何利用工业网关集中监测管理?
在制造业中的应用与日俱增,使用,不仅提高了设备和场地的利用率,还能保持稳定的水平。随着工业机器人的大规模部署,对于数量众多、类型各异、功能不一的机器人的监测、管理和维护,也成为企业面临的关键问题。 针对工业机器人的集中监测和管理,可以部署佰马BMG700数据采集 工业智能网关 ,协助企业打造集合数据采集、数据分析、远程管控、边缘计算等应用的系统解决方案。助力实现更可靠、稳定的连续生产。 当前常见的工业机器人种类包括: 焊接机器人:执行焊接、切割,对定位精度和移动精度有极高要求 码垛机器人:将物体按一定排列码放在托盘、栈板上,进行自动堆码堆层 运输机器人:将工件从一处运输到另一处,主要体现机器人行驶路线规划、行驶避障等能力 喷
[机器人]
STM8学习笔记(二):GPIO的输入
这两天有点忙,焊了四个按键,在LED灯的基础上,实现GPIO的输入 这次用的是ST公司的官方库 组要的还是要理解GPIO的几个寄存器的功能 同时,要好好的理解它官方库里面的函数定义和用法 /**************************************************************/ void GPIO_Configuration(void) { GPIO_Init(LEDS_PORT, (LED1_PIN | LED2_PIN | LED3_PIN | LED4_PIN | LED5_PIN | LED6_PIN | LED7_PIN | LED8_PIN), GPIO_MODE_OUT_PP_H
[单片机]
C51指针类型和存储区的关系详解
一、存储类型与存储区关系   data --- 可寻址片内ram   bdata --- 可位寻址的片内ram   idata --- 可寻址片内ram,允许访问全部内部ram   pdata --- 分页寻址片外ram (MOVX @R0) (256 BYTE/页)   xdata --- 可寻址片外ram (64k 地址范围)   code --- 程序存储区 (64k 地址范围),对应MOVC @DPTR 二、指针类型和存储区的关系   对变量进行声明时可以指定变量的存储类型如:   uchar data x和data uchar x相等价都是在内ram区分配一个字节的变量。
[单片机]
STM8学习笔记---ADC平均值采样和有效值采样算法分析
在开关电源中,电流采样是非常重要的。常用的电流采样计算方法有平均值采样法和有效值采样法。现将这两种电流采样算法进行分析比较。 硬件连接示意图 交流220V通过全桥整流滤波后变为直流310V,直流310V给后端负载供电,采样电阻Rs串联在直流回路的地线中。 当设备工作时,电流从整流桥正极流出经过负载,然后经过采样电阻Rs回到整流桥负极。由于采样电阻Rs的阻值很小,采样电阻上的压降只有零点几伏,所以采样电阻不会对负载造成影响。由于采样电阻上的压降很小,MCU不能直接使用,所以通过放大电路,将采样电阻上的电压放大到MCU能直接识别的范围内,然后通过MCU上的ADC口直接读取放大电路出来的电压信号,就能计算出输入电流值的大小。
[单片机]
<font color='red'>STM8</font>学习笔记---ADC平均值采样和有效值采样算法分析
基于神经网络的声测法车辆类型辨识的应用研究
    摘要: 介绍了基于多层前馈神经网络的学习训练方法、运用噪声测量原理和方法判别汽车类型的识别系统,为汽车交通管理和监测统计提供了有力的依据和手段。     关键词: 汽车 神经网络 噪声 识别 随着我国高速公路和汽车技术的迅猛发展,汽车行驶速度越来越高,极需一种更有效交通管理系统。这种系统应能自动识别汽车,并能准确判断出汽车类型。20世纪50年代以来,点测试设备如环形成圈检测器,主要用于十字路口的交通控制和交通数据收集。这种探测系统通常利用埋置于路面下的电感线圈,通过电磁感应识别汽车,但这种系统存在着铺设费用昂贵、维护困难、不能将汽车分类等缺陷。利用声测地,并将此经过神经网络的训练,能够有效地识别路面上
[测试测量]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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