SDCC与KEILC的差别Word格式.docx
- 文档编号:19942962
- 上传时间:2023-01-12
- 格式:DOCX
- 页数:14
- 大小:21.38KB
SDCC与KEILC的差别Word格式.docx
《SDCC与KEILC的差别Word格式.docx》由会员分享,可在线阅读,更多相关《SDCC与KEILC的差别Word格式.docx(14页珍藏版)》请在冰豆网上搜索。
Csourcecode:
union
unsignedchara_byte;
struct
unsignedcharbit0:
1;
unsignedcharbit1:
unsignedcharbit2:
unsignedcharbit3:
unsignedcharbit4:
unsignedcharbit5:
unsignedcharbit6:
unsignedcharbit7:
}a_bit;
}a;
bitb;
voidmain(void)
a.a_byte=0x05;
a.a_bit.bit6=1;
b=1;
while
(1);
//programloop
Assemblylisting(.rstfile):
...
159;
sdcctest.c:
21:
a.a_byte=5;
160;
genPointerSet
161;
genNearPointerSet
162;
genDataPointerSet
0031752105163mov_a,#0x05
164;
23:
a.a_bit.bit6=1;
165;
166;
00347821167movr0,#_a
168;
genPackBits
0036E6169mova,@r0
00374440170orla,#0x40
0039F6171mov@r0,a
172;
25:
b=1;
173;
genAssign
003AD200174setb_b
175;
27:
while
(1);
Althoughthebitfieldsindeclarationof"
a"
appeartobebit-addressablememory,theassemblylisting(takenfromthe.rstfilegeneratedbySDCC)showsthatthevariabledoesnotusebitaddressing.Inthelistingdonotconfuse"
and"
_a"
.The"
referstotheaccumulatorwhilethe"
referstothevariable.
Notethatthe"
AbsoluteAddressing"
sectionofthisappnotepresentsaninterestingwaytoallocatememorysoitactsastruebit-addressablememory.
near/data
李愷兒測試的結果,near是使用InternalRAM
DeclaringavariablewiththenearordatastorageclassplacesthevariableindirectlyaddressableRAMinthe8051-core.TheDS89C430/450familyofmicrocontrollershas128bytesofdirectlyaddressablememoryavailable.Thisisthefastesttypeofmemorythatcanbeaccessedbythe8051,andtheassemblycodegeneratedtoreadorwritedatainthisareaofRAMrequiresasingleMOVinstruction.
#include"
sdcc_reg420.h"
dataunsignedcharoutPort0=0x4A;
P0=outPort0;
while
(1);
Thesdcc_reg420.hdefinitionfileusedinthisexampleisgiveninAppendixA.
far/xdata
這邊李愷兒的測試,far是使用ExternalRAM
DeclaringavariablewiththefarorxdatastorageclassplacesthevariableinexternalRAM.AlthoughthisgivesthedeveloperaccesstoamuchlargerRAMspace,theassemblycodegeneratedtoreadandwritetothismemoryusesaMOVXinstructionwhichrequiresloadingtheexternalmemoryaddressintothedatapointer.
TheDS89C430/450familyofmicrocontrollersincludesa1kilobyteinternalSRAMthatcanbeusedforvariablesdeclaredwithfar/xdata.NotethattheDME1:
0bitsinthePowerManagementRegister(PMR)mustbesetforinternalSRAMmodebeforethismemorycanbeinitializedorused.
xdataunsignedcharioPorts[2];
PMR|=0x01;
//Enableinternal1KSRAM
ioPorts[0]=0x4A;
ioPorts[1]=0x56;
P0=ioPorts[0];
P1=ioPorts[1];
idata
idata我測試跟near/data感覺上差不多
Declaringavariablewiththeidatastorageclassplacesthevariableinindirectlyaddressablememorywithinthe8051-core.Indirectlyaddressablememoryissimilartodirectlyaddressablememoryasthereare128-bytesavailableinthe8051-core(notincludingSpecialFunctionRegisters).Accessingidata,however,requiresanextraMOVcommandtomovetheRAMaddressintoaworkingregister.
idataunsignedintport0_x2;
while
(1)//programloop
port0_x2=P0*2;
pdata
這也是直接accessexternalRAM
Thepdatastorageclassisusedtoaccesspagedexternaldatamemory.ThismemorytypeisbeyondthescopeofthisapplicationnoteandinterestedreadersareencouragedtoreviewthepdatasectionintheSDCCdocumentation.
code
這就直接使用flash當成readonlydata,在PIC的Hi-TECHC等同於const,而SDCC用const也可以
Declaringavariablewiththecodestorageclassindicatesthatthevariablewillbeplacedinprogrammemory(specificallyflashmemorywithintheDS89C430/450microcontrollers).Thevariablesareread-onlyfortheSDCC,thereforeusecodetodeclareconstants(suchaslookuptables)inyourprogram.
codeunsignedcharout[10]={0x03,0x45,0xFA,0x43,0xDD,
0x1A,0xE0,0x00,0x87,0x91};
dataunsignedchari=0;
P0=out[i++];
if(i==10)
i=0;
bit
Declaringavariablewiththebitstorageclassplacesitinbit-addressablememoryinthe8051-core.The8051-corehas16bytesofdirectaddressableRAMthatcanactasbit-addressablememory(bytes0x20to0x2F),providing128totaladdressablebits.Variablesofthistypeareefficientuseofmemoryforflags.
#defineESCAPE0x1B
bitesc_char_flag=0;
P1=0x00;
while(!
esc_char_flag)
if(P0==ESCAPE)
esc_char_flag=1;
P1=0xFF;
sfr
ThesfrstorageclassdefinesaspecificSpecialFunctionRegister(SFR)inthe8051-core.ThedefinitionfilepresentedinAppendixAdefinesalltheSFRsintheDS89C430/450microcontrollersusingthesfridentifier.
NotethatthefollowingexampledefinestheSFRs.Includingthedefinitionfilesdcc_reg420.hwasthereforenotnecessary.
sfrat0x80P0;
sfrat0x90P1;
P0=0x00;
sbit這個有趣了,這容易跟sfr的位置弄混,其實這兩個的位置的定義是不一樣的,sfr是定義sfraddress,而sbit是定義abitaddress,請參考note最後面的KeilC對於sbit部份說明。
最後一段最經典
Thesbitstorageclassdefinesaspecificbitinsideabit-addressableSFR.Inthe8051-core,allSFRswithanaddressthatfinisheswitheithera0oran8(inhex)arebitaddressable.
//Port0
sbitat0x80P0_0;
//Port0bit0
sbitat0x81P0_1;
//Port0bit1
sbitat0x82P0_2;
//Port0bit2
sbitat0x83P0_3;
//Port0bit3
sbitat0x84P0_4;
//Port0bit4
sbitat0x85P0_5;
//Port0bit5
sbitat0x86P0_6;
//Port0bit6
sbitat0x87P0_7;
//Port0bit7
//P0=0x00
P0_4=1;
//P0=0x10
AbsoluteAddressing絕對位置定義,我覺得SDCC這功能還蠻棒的,使用at。
但是要小心這裡面似乎有bug,還沒有趣研究
AbsoluteaddressingissupportedbytheSDCCusingtheatidentifier.TheSDCCwillnot,unfortunately,trackvariablesdeclaredatabsoluteaddressesandmaydeclareothervariablessothattheywilloverlap.
Thefollowingexampleprogrampresentsinterestingpotentialbugs.
unsignedchara=0x4A;
unsignedintb=0x0000;
unsignedcharc[64]={0x00};
unsignedcharat0x0010y;
unsignedcharat0x0010z;
for(b=0;
b<
64;
b++)
c[b]=0xAA;
y=0xF1;
z=0xF2;
a=c[5];
UsingtheSDCC,theexamplecompileswithoutanyerrorsoranywarnings,eventhoughtwovariables,"
y"
z"
areassignedtothesamelocation.Next,ifweweretorunthisprogram,wewouldexpertthefinalassignmentintheprogram(a=c[5])toset"
to0xAA.Butthisisnotthecase.Theactualvalueof"
afterthefinalassignmentis0xF2.
Wecanseethereasonforthisstrangeresultbyexaminingthefollowinglinesinthe.mapfilecreatedbySDCCthatshowtheactualaddressesusedforeachvariable.
AreaAddrSizeDecimalBytes(Attributes)
----------------------------------------------------------------
..ABS.00000000=0.bytes(ABS,OVR)
ValueGlobal
----------------------------------------
0010_y
0010_z
DSEG00080043=67.bytes(REL,CON)
0008_a
0009_b
000B_c
Notethattheunderscoreplacedatthebeginningofthevariablenameisaddedbythecompiler.If"
c"
willbelocatedataddress0x000Bandwillbeanarray64byteslong,itwilloverlapthe"
variablesataddress0x0010.
Auseforabsoluteaddressingistosimulatebit-addressablevariables.Inthefollowingexample,wechoosetodefinethevariablen_byteatthelastbytelocationinbit-addressablememory.Next,wedefinen_bit0ton_bit7inthelast8bitlocationsofbit-addressablememoryinthe8051-core.Astheseoverlap,then_bytevariablecanbebitaddressedusingthen_bit0ton_bit7variables.
dataunsignedcharat0x002Fn_byte;
bitat0x78n_bit0;
bitat0x79n_bit1;
bitat0x7An_bit2;
bitat0x7Bn_bit3;
bitat0x7Cn_bit4;
bitat0x7Dn_bit5;
bitat0x7En_bit6;
bitat0x7Fn_bit7;
n_byte=0x00;
n_bit4=1;
P0=n_byte;
MemoryModels
TheSDCCsupportstwomemorymodels:
smallandlarge.Whenusingthesmallmemorymodel,theSDCCdeclaresallvariableswithoutastorageclass(i.e.,data,idata,xdata,pdata,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SDCC KEILC 差别