對(duì)于STM8單片機(jī)Flash的塊編程,代碼必須在Ram內(nèi)存中運(yùn)行。因此,存儲(chǔ)在Flash中的代碼必須拷貝到Ram中編譯、鏈接、運(yùn)行。Cosmic編譯器有兩種實(shí)現(xiàn)方法:在STVD工程中創(chuàng)建段、在鏈接文件中創(chuàng)建內(nèi)存段
1、在STVD工程中創(chuàng)建段
1)、在工程中設(shè)置段名
‘project’->‘settings’->‘linker’->‘category’->‘input’,如下圖所示:
設(shè)置段名‘.FLASH_CODE’,注意同時(shí)設(shè)置options為‘-ic’,ic的意義為moveable code。
2)、編寫(xiě)存放在段FLASH_CODE中的代碼,如下所示
#pragma section(FLASH_CODE)//把代碼放到FLASH_CODE段
void writeFlash(void)
{
……
}
void eraseFlash(void)
{
……
}
#pragma section()//代碼放置到默認(rèn)段
2、在鏈接文件中創(chuàng)建內(nèi)存段
1)、在鏈接文件(*.lkf)中定義特殊的內(nèi)存段,并以‘-ic’標(biāo)記,如下所示:
2)、編寫(xiě)存放在段FLASH_CODE中的代碼,如下所示
#pragma section(FLASH_CODE)//把代碼放到FLASH_CODE段
void writeFlash(void)
{
……
}
void eraseFlash(void)
{
……
}
#pragma section()//代碼放置到默認(rèn)段
3、可以在生成的map文件中檢查以上兩種方式的設(shè)置是否正確,如下map文件:
標(biāo)記‘from’的為存放代碼部分,標(biāo)記‘initialized’的為執(zhí)行代碼部分。
4、調(diào)用函數(shù)
在調(diào)用這些函數(shù)之前,必須把這些代碼從flash拷貝到Ram,cosmic編譯器使用內(nèi)置的函數(shù)‘int _fctcpy(char name)’實(shí)現(xiàn)此功能。其中name為定義的段名的首字母,如本例中的‘F’,
void main(void)
{
……
_fctcpy(‘F’);//把Flash部分的代碼拷貝到Ram
……
}