久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 19630|回復: 0
打印 上一主題 下一主題
收起左側

STM8使用----STVD(COSMIC)定義變量指定其類型和位定義

[復制鏈接]
跳轉到指定樓層
樓主
ID:72519 發表于 2015-1-23 18:28 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
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.               

然后重新編譯一下就可以了。

評分

參與人數 1黑幣 +15 收起 理由
凌凈清河 + 15 請接受四年之后的感謝!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久激情网 | 久久久久国产精品一区二区 | 久久久免费少妇高潮毛片 | 超碰国产在线 | 先锋av资源在线 | 久草中文在线观看 | 产真a观专区 | 久久最新 | 一起操网站 | 99re在线视频 | 久久久久综合 | 国产精品久久久久久久免费大片 | 日韩美女一区二区三区在线观看 | 欧美一区二区免费视频 | 国产在线观看一区二区三区 | 欧美久久一区二区三区 | 91视频在线看 | 亚洲国产精品久久 | 九九热国产精品视频 | 欧美日韩在线一区二区 | 九九精品影院 | 精品免费国产一区二区三区 | 国产三区av| www.干| 91精品国产91久久久久久密臀 | 国产日韩免费观看 | 久久成人精品视频 | 亚洲天堂中文字幕 | 成人综合久久 | 精品国产乱码久久久久久88av | 另类 综合 日韩 欧美 亚洲 | 久草视频网站 | 草久久 | 亚洲视频在线免费观看 | 国产精品亚洲一区二区三区在线观看 | 日韩综合在线视频 | 欧美一级片久久 | 青青久草 | 国产高清精品一区二区三区 | 亚洲欧美久久 | 中文字幕在线观看一区二区 |