专利名称:一种扩展程序存储空间和动态升级程序的程序编码方法
技术领域:
本发明涉及一种利用外部数据处理,改善单片机内部运行性能的程序编码方法,是一种可扩展程序存储空间和动态升级程序的程序编码方法。
背景技术:
现有单片机系统,由于其端口特性的限制,均限定了程序存储空间,在运行较多内容的时候,程序员不得不寻找一个最优化的解决方案,使得程序能够限定在一定的大小;也有单片机系统,提供了可扩展程序内存的端口,但是其扩充内存的大小,仍然有限制。
这使得绝大多数单片机系统,仅仅适合简单的工作流程,也使得很多需要单片机系统的装置上,需要安装一个以上的单片机系统,以适应不同的解决方案,如此以来,大大浪费了单片机的资源,并且需要在一台机器上调试多套单片机系统。
而且,不同的单片机,使用的语言也不尽一致,各有各的规范,一旦在一台机器上使用多种单片机系统,不仅大大增加了程序员的工作量,而且不能保证各系统之间的兼容性。
发明内容
针对目前单片机系统应用上的多种规范,难以统一执行的问题,也为了扩充单片机的使用效能,尤其对已固化程序的单片机进行程序升级,本发明提出一种新型的程序编码方法其特征在于在单片机系统中的存储数据的存储区的若干地址段上设定若干程序代码内容片段,这些程序代码内容片段中以特定的结构指定若干存放于单片机程序存储区的以该单片机的机器代码构成的程序段的起始地址位置信息及为使这些程序段能正常工作提供的接口数据;单片机访问所述存于存储数据的存储区的程序代码内容片段,当得到下一步须执行的存于程序存储区的机器代码段的信息,就执行该机器代码段,直到所述存于存储数据的存储区的程序代码内容片段所对应的任务完成。
所述存于存储数据的存储区的程序代码内容片段的一个完整程序代码段,至少包含一个本段代码的说明部分,这个说明部分是本段代码的第一部分,放在本段代码的开始部分,这个说明部分包含本段代码的标识、长度、及其它需要说明的信息。
所述存于存储数据的存储区的程序代码内容片段的一个完整程序代码段至少包含一个本段代码的实体部分,这个实体部分由一个一个的语句代码组成,每个语句代码对应于一个以文字和符号等助记符所表述的高级语言语句。一个实体部分至少包含一个这样的一种语句代码这种语句代码至少包含一组存放于单片机的程序存储区的由该单片机的机器代码构成的一个程序段的起始地址位置信息及为这个程序段能正常工作提供的接口数据,单片机在访问这个语句代码获取这个由机器代码构成的程序段的起始地址后执行之,并且这个语句代码的某些片段如果被当做机器语言代码来看待时,单片机执行这些机器语言代码并不能实现该语句代码所要完成的功能。一个实体部分至少包含一个这样的一种语句代码这种语句代码至少包含一组数据用于指示下一步要运行的其它语句代码的信息;并且这一组数据如果只是表示语句代码先后顺序的序列号时,则包含了这个实体部分的这段完整的程序内容代码段还至少包含一个语句索引部分;这个语句索引部分至少包含了这个实体部分的若干特殊语句代码的起始位置信息,这些特殊的语句代码是这个实体部分的某些语句代码执行完后不顺序执行下一个紧邻的语句代码而须执行的下一步语句代码。
依据本发明所编制的程序代码,因为可存放于单片机可读取的存储数据的存储区中,突破了以往单片机的程序代码必须放在该单片机可访问的程序存储区中的限制,从而实现单片机扩展程序空间的目的。对于需要动态升级程序或对已固化的单片机升级程序的单片机系统,不论该单片机是否有外部程序扩展功能,通过选择合适的外部存储器,该单片机通过输入、输出端口或串行总线或其它外部接口,按该外部存储器的接口要求与该外部存储器相连,将这次应用程序所需的一些基本功能的实现机器代码段放入固化的程序中,并在访问该外部存储器的固化代码中预先设定该外部存储器中存在升级程序的条件。当需要升级程序时,将依据本发明所编制的用于升级的程序代码放入该外部存储器中,并将该外部存储器装入到该单片机系统中,这样即可实现动态升级程序及对已固化的单片机升级程序的目的。由于存放于单片机系统的存储数据的存储区中的依本发明所编制的程序代码段的内容可以不因单片机种类的变化而变化,从而可以实现同一个程序代码在不同种类的单片机平台上运行的目的。
图1-实施例1的单片机内部存储结构示意中,1-内部64千字节程序只读存储器2-内部1936千节扩展数据存储器图2-实施例1的运行结果图3-实施例2的单片机与扩展内存的连接示意4-实施例2的运行结果具体实施例实施例1本实施例以HMC公司的HMC83753单片机编程为例,提供一种运用在8位单片机上的编码方法。
如图1所示,HMC83753单片机具有64千字节的内部程序只读存储器和1936千字节的内部数据只读存储器,依据本发明编制的程序代码可以置于内部数据只读存储器中,即可实现将程序空间从64千字节扩大到2000千字节的目的。
一个高级语言语句如下displaycin 00 00 is″上综″201ah move 42″幅″201ahnextline″金″201ah move 60h″亿″nextline″高″201ah move 42″昨″code 1ahnextline″低″201ah move 42″今″code lah;
放在内部扩展数据存储器中的利用本编码方法编制的程序代码DB00H,02H,00H,39H,02H,13H,00H高级语言语句的行号 总长度程序地址DB00H,00H,0DH,66H,12H,96H,20H,1AH液晶显示的起始行号 液晶显示起始列号显示“上”显示“综”显示“”DB 90H,2AH,06H,F4H,20H,1AH,91H,00H右移2AH长度 显示“幅” 显示“” 换行DB09H,1FH,20H,1AH,90H,60H,10H,BFH显示“金”显示“” 右移60H 显示“亿”DB91H,00H,07H,38H,20H,1AH,90H,2AH换行 显示“高” 显示“”右移2AHDB12H,ADH,20H,1AH,91H,00H,06H,0CH显示“昨”显示“” 换行 显示“低”DB20H,1AH,90H,2AH,09H,20H,20H,1AH显示“” 换行 显示“今”显示“”DBFFH表示显示程序结束内部只读程序存储器地址001302H中放入如下汇编程序gm_start_tpp equ 80hgm_start_tph equ 81hgm_start_tpl equ 82hgm_tpp equ 83hgm_tph equ 84hgm_tpl equ 85hgm_up equ 86hgm_down equ 87hgm_pp equ 88hgm_dp equ 89hgm_fb_pp equ 8ahgm_fb_dp equ 8bhgm_spp equ 8chgm_sdp equ 8dhgm_page equ 8ehgm_row equ 8fhgm_mode equ 90hgm_judge equ 91hgm_emptyl equ 92hgm_empty2 equ 93hgm_empty3 equ 94hgm_shift equ 95h
mode1da0 M60hsta0 M12hlda0 M61h;lda #70hsta0 M11h1da0 M62hsta0 M10hlda #00hsta r_ppcall keyscansta0 M90hlda #00hsta r_ppcall keyscansta0 M8ahlda #00hsta r_ppcall keyscansta0 M8bhlda0 M8ahsta r_pplda0 M8bhsta r_dplda ianda #0cfhsta ilda0 M90hcmpe #01hbrz gmlcmpe #02hbrz gm2cmpe #03hbrz gm3br gm_errogm_overlda0 M8ahsta r_pplda0 M8bhsta r_dplda iora #10hsta iret
gm_errolda0 M8ahsta r_pplda0 M8bhsta r_dplda iora #20hsta iretgm_exitretgmllda #00hsta0 M8chlda #0a0hsta0 M8dhlda #00hsta r_ppcall keyscanadda #0b0hsta0 M8ehlda #00hsta r_ppcall keyscansta0 M8fhlda0 M12hsta0 M80hlda0 M11hsta0 M81hlda0 M10hsta0 M82hlda0 M8chsta r_pplda0 M8dhsta r_dplda0 M8ehsta ilda0 M8dhincasta0 M8dhsta r_dplda0 M8fhsta ilda0 M8dh
incasta0 M8dhsta r_dplda0 M12hsta ilda0 M8dhincasta0 M8dhsta r_dplda0 M11hsta ilda0 M8dhincasta0 M8dhsta r_dplda0 M10hsta ilda0 M8dhincasta0 M8dhlda #11hsta0 M87hsta0 M86hlda #00hsta r_ppcall gm1_displda0 M91hcmpe #00hbrz gm1_onecmpe #02hbrz gm_errolda #00hsta0 M87hlda #00hsta r_pplda #0bhsta M21hlda #0b7hsta M26hlda #18hsta M27hlda #00hsta M28hlda #00h
sta r_ppcall disp_keylgml_onelda #00hsta r_ppsta M21hgml_1lda M21hcmpe #00hbrz gml_1cmpe #69hbrnz gml_2br gm_exitgml_2cmpe #0bhbrnz gml_3lda0 M87hcmpe #11hbrz gml_4lda #00hsta r_ppcall clearlda #11hsta0 M87hsta0 M86hlda0 M8dhsuba #05hsta0 M8dhlda0 M8chsta r_pplda0 M8dhsta r_dplda ista0 M8ehlda0 M8dhincasta0 M8dhsta r_dplda ista0 M8fhlda0 M8dhincasta0 M8dhsta r_dplda ista0 M12h
lda0 M8dhincasta0 M8dhsta r_dplda ista0 M11hlda0 M8dhincasta0 M8dhsta r_dplda ista0 M10hlda0 M8dhincasta0 M8dhcall gml_displda #00hsta0 M86hlda #00hsta r_pplda #0dhsta M21hlda #0b0hsta M26hlda #18hsta M27hlda #00hsta M28hlda #00hsta r_ppcall disp_keyllda0 M91hcmpe #00hbrz gml_4cmpe #02hbrz gm_errolda #00hsta0 M87hlda #00hsta r_pplda #0bhsta M21hlda #0b7hsta M26h
lda #18hsta M27hlda #00hsta M28hlda #00hsta r_ppcall disp_keylbr gm1_4gml_3cmpe #0dhbrnz gml_4lda0 M86hcmpe #11hbrz gml_4lda #00hsta r_ppcall clearlda #11hsta0 M87hsta0 M86hlda0 M8dhsuba #0fhsta0 M8dhlda0 M8chsta r_pplda0 M8dhsta r_dplda ista0 M8ehlda0 M8dhincasta0 M8dhsta r_dplda ista0 M8fhlda0 M8dhincasta0 M8dhsta r_dplda ista0 M12hlda0 M8dhincasta0 M8dhsta r_dp
lda ista0 M11hlda0 M8dhincasta0 M8dhsta r_dplda ista0 M10hlda0 M8dhincasta0 M8dhlda #00hsta r_pplda0 M12hcmpe M80hbrnz gm1_31lda0 M11hcmpe M81hbrnz gm1_31lda0 M10hcmpe M82hbrnz gml_31br gml_32gml_311da #00hsta0 M86hlda #00hsta r_pplda #0dhsta M21hlda #0b0hsta M26hlda #18hsta M27hlda #00hsta M28hlda #00hsta r_ppcall disp_keylgml_32call gml_displda #00hsta0 M87hlda #00hsta r_pplda #0bh
sta M2lhlda #0b7hsta M26hlda #18hsta M27hlda #00hsta M28hlda #00hsta r_ppcall disp_keyllda0 M91hcmpe #01hbrnz gm_errogml_4lda #00hsta M21hbr gml_1gm2lda #00hsta r_ppcall keyscanadda #0b0hsta0 M8ehlda #00hsta r_ppcall keyscansta0 M8fhlda #00hsta r_ppcall gm_h_displda0 M91hcmpe #00hbrz gm_exitcmpe #01hbrz gm_overbr gm_errogm3lda #00hsta r_ppcall keyscanadda #0b0hsta0 M8ehlda #00hsta r_ppcall keyscansta0 M8fh
lda #00hsta r_ppcall keyscancmpe #01hbrz gm3_highcmpe #02hbrz gm3_lowcmpe #03hbrz gm3_dpbr gm_errogm3_highlda #00hsta r_ppcall keyscansta0 M92hlda #00hsta r_ppcall keyscansta0 M93hlda #00hsta r_ppcall keyscansta0 M94hlda0 M92hsta0 M12hlda0 M93hsta0 M11hlda0 M94hsta0 M10hcall gm_h_displda0 M91hcmpe #00hbrz gm_exitcmpe #01hbrz gm_overbr gm_errogm3_lowlda #00hsta r_ppcall keyscanlda #00hsta0 M92hlda #00hsta r_pp
call keyscansta0 M93hlda #00hsta r_ppcall keyscansta0 M94hlda0 M92hsta0 M12hlda0 M93hsta0 M11hlda0 M94hsta0 M10hcall gml_displda0 M91hcmpe #00hbrz gm_exitcmpe #01hbrz gm_overbr gm_errogm3_dplda #00hsta r_ppcall keyscanlda #00hsta r_ppcall keyscansta0 M93hlda #00hsta r_ppcall keyscansta0 M94hlda0 M93hsta0 M88hlda0 M94hsta0 M89hbr gm_ram_disp最后显示结果如图2所示。
实施例2本实施例以NEC公司的MPD784216单片机为例,提供一种运行在16位单片机上的编码方法。
如图3所示,只有1000千字节外部程序扩展功能的NEC公司的μ784216芯片如已腌摸固化后,与预先布于印制板上的外部FLASH型外部存储器的连接,该FLASH型外部存储器有2000千字节存储空间,在需要升级程序时,依据本发明编制的程序代码放于该外部FLASH存储器中,即可实现最大2000千字节的升级程序。
图3中,μ784216芯片的引脚功能如下PIN48至PIN55对应A0至A7PIN56至PIN63对应AD0至AD7PIN64至PIN71对应A8至A15PIN73至PIN76对应A16至A19PIN77至PIN79对应RD,WR,WAIT一个高级语言语句如下displaycin(3,1)is″等待电脑数据″00d1h 00d2h;放在外部的2000千字节的FLASH型存储器的利用本编码方法编制的程序代码DB02h,00H,25H,00H,78H,05H,00H,20H,0FDH,0FH,17H,高级语言语句行号 总长度程序地址 接口数据地址 数据总长度DB40H,0FEH,0FH,03H,01H,07h,06H,程序运行情况反馈地址 液晶显示的起始行号 液晶显示的起始行号 显示“等”DB0DEH,05H,26H,06H,95H,0BH,0F2H,0DH6AH,09H,显示“待” 显示“电” 显示“脑” 显示“数”显示“据”
DB0D1H,00H,0D2H,00H,0FFh,0FFH显示“-”显示“-” 表示显示程序结束内部只读程序存储器地址000578H中放入汇编程序如下汇编列表文件行号 行号 地址 代码 源程序1 1 NAME axsn2 23 3 public axsz4 4 extrn lcd_lin,lcd_vol,key_code,disp_code5 5 extrn disp_one,disp_key6 6 extrn inter1,inter4,inter5,inter6,inter7,lcd_volmax,lcd_linmax7 7 (000FFD80) axsdz equ 0ffd80h8 8 ------ CSEG9 91010 000000 axsz1111 000000 49 push psw1212 000001 05AA sel rb21313 000003 B900mov a,#00h1414 000005 R3C07B000 mov [%inter1],a1515 000009 R38DB000000 movgtde,#inter71616 00000E R38BB000000 movguup,#inter61717 000013 R3C6F0001 cmp inter4,#01h1818 000017 8330bc $axs_err1919 000019 R3C6F0000 cmp inter4,#lcd_linmax2020 00001D 8302bc $axs_82121 00001F 8028bnz $axs_err2222 000021 axs_82323 000021 R3C6F0001 cmp inter5,#01h2424 000025 8322bc $axs_err2525 000027 R3C6F0000 cmp inter5,#lcd_volmax2626 00002B 8302bc $axs_62727 00002D 801Abnz $axs_err2828 00002F axs_62929 00002F R3C6F00FF cmp inter7,#0ffh3030 000033 8120bz $axs_ret3131 000035 R3C6F0020 cmp inter7,#20h3232 000039 8335bc $axs_13333 00003B 811Abz $axs_23434 00003D R3C6F0090 cmp inter7,#90h3535 000041 8117bz $axs_33636 000043 R3C6F0091 cmp inter7,#91h
3737 000047 8117 bz $axs_43838 000049axs_err3939 000049 R38F900movg whl,inter14040 00004C 3D8F set1 [whl],74141 00004E 1405 br $axs_ret4242 000050axs_err24343 000050 R38F900movg whl,inter14444 000053 3D8D set1 [whl],54545 000055axs_ret4646 000055 48 pop psw4747 000056 56 ret4848 000057axs_24949 000057 436200 br $!axs_2a5050 00005Aaxs_35151 00005A R2A380000 add inter5,inter65252 00005E 143D br $axs_95353 000060axs 45454 000060 R3C6F0000 cmp inter6,#00h5555 000064 81EA bz $axs_err25656 000066 R2A300000 mov inter5,inter65757 00006A R3C680002 add inter4,#02h5858 00006E 142D br $axs_95959 000070axs_16060 000070 RB900 mov a,#lcd_volmax6161 000072 R7A1100sub a,inter56262 000075 8304 bc $axs_al6363 000077 AF0F cmp a,#0fh6464 000079 8208 bnc $axs_56565 00007Baxs_al6666 00007B R3C3A0001 mov inter5,#01h6767 00007F R3C680002 add inter4,#02h6868 000083axs_56969 000083 R3C6F0000 cmp inter4,#1cd_linmax7070 000087 8265 bnc $axs_err17171 000089 R2A300000 mov lcd_lin,inter47272 00008D R2A300000 mov lcd_vol,inter57373 000091 R2AB00000 movw disp code,inter67474 000095 R09F00000 call !!disp_one7575 000099 R3C680010 add inter5,#10h7676 00009Daxs_97777 00009D 78DB020000 addg tde,#02h7878 0000A2 78BB020000 addg uup,#02h7979 0000A7 38DC80 movg axsdz,tde8080 0000AA 073080 mov a,[%axsdz]
8181 0000AD R381500 mov inter7,a8282 0000B0 38BC80 movg axsdz,uup8383 0000B3 073080 mov a,[%axsdz]8484 0000B6 R381500 mov inter6,a8585 0000B9 4373FF br$!axs_68686 0000BC axs_2a8787 0000BC RB900 mov a,#lcd_volmax8888 0000BE R7A1100 sub a,inter58989 0000C1 8304bc$axs_a29090 0000C3 AF05cmp a,#05h9191 0000C5 8208bnc $axs_79292 0000C7 axs_a29393 0000C7 R3C3A0001 mov inter5,#01h9494 0000CB R3C680002 add inter4,#02h9595 0000CF axs_79696 0000CF R3C6F0000 cmp inter4,#lcd_linmax9797 0000D3 8219 bnc $axs_err19898 0000D5 R2A300000 mov lcd_lin,inter49999 0000D9 R3C2600 inc lcd_lin100 100 0000DC R2A300000 mov lcd_vol,inter5101 101 0000E0 R2A300000 mov key_code,inter6102 102 0000E4 R09F00000 call !!disp_key103 103 0000E8 R3C680005 add inter5,#05h104 104 0000EC 14AFbr$axs_9105 105 0000EE axs_errl106 106 0000EE R38F900 movg whl,interl107 107 0000F1 3D8Esetl [whl].6108 108 0000F3 435FFF br$!axs_ret109 109;----------------110 110END状态信息Target chipuPD784216Device fileV1.11Assembly complete,0 error(s)and 0 warning(s)found.(0)最后液晶显示如图4所示。
权利要求
1.一种扩展程序存储空间和动态升级程序的程序编码方法,其特征在于在单片机系统中的存储数据的存储区的若干地址段上设定若干程序代码内容片段,所述程序代码内容片段中以特定的结构指定若干存放于单片机程序存储区的以该单片机的机器代码构成的程序段的起始地址位置信息及为使这些程序段能正常工作提供的接口数据;单片机访问所述存于存储数据的存储区的程序代码内容片段,当得到下一步须执行的存于程序存储区的机器代码段的信息,就执行该机器代码段,直到所述存于存储数据的存储区的程序代码内容片段所对应的任务完成。
2.如权利要求1所述的一种扩展程序存储空间和动态升级程序的程序编码方法,其特征在于所述存于存储数据的存储区的程序代码内容片段,至少包含一个本段代码的说明部分,这个说明部分是本段代码的第一部分,放在本段代码的开始部分,这个说明部分包含本段代码的标识、长度、及其它需要说明的信息;所述存于存储数据的存储区的程序代码内容片段,至少包含一个本段代码的实体部分,这个实体部分由一个一个的语句代码组成,每个语句代码对应于一个以文字和符号等助记符所表述的高级语言语句。
3.如权利要求2所述的程序代码内容片段的实体部分,其特征在于一个实体部分至少包含一个这样的一种语句代码这种语句代码至少包含一组存放于单片机的程序存储区的由该单片机的机器代码构成的一个程序段的起始地址位置信息及为这个程序段能正常工作提供的接口数据,单片机在访问这个语句代码获取这个由机器代码构成的程序段的起始地址后执行之。
4.如权利要求2所述的程序代码内容片段的实体部分,其特征在于一个实体部分至少包含一个这样的一种语句代码这种语句代码至少包含一组数据用于指示下一步要运行的其它语句代码的信息。
5.如权利要求3所述的程序代码内容片段的实体部分,其特征在于如果所述包含起始地址位置信息和接口数据的语句代码的某些片段被当做机器语言代码来看待时,单片机执行这些机器语言代码并不能实现该语句代码所要完成的功能。
6.如权利要求4所述的程序代码内容片段的实体部分,其特征在于如果所述包含用于指示下一步要运行的其它语句代码的信息的数据只是表示语句代码先后顺序的序列号时,则包含了这个实体部分的这段完整的程序内容代码段还至少包含一个语句索引部分。
7.如权利要求6所述的程序代码内容片段的实体部分,其特征在于所述语句索引部分至少包含了这个实体部分的若干特殊语句代码的起始位置信息,这些特殊的语句代码是这个实体部分的某些语句代码执行完后不顺序执行下一个紧邻的语句代码而须执行的下一步语句代码。
全文摘要
本发明针对目前单片机系统应用上的多种规范,难以统一执行的问题,也为了扩充单片机的使用效能,尤其对已固化程序的单片机进行程序升级,本发明提出的一种新的编码方法可以使单片机访问存于存储数据的存储区的程序代码内容片段,当得到下一步须执行的存于程序存储区的机器代码段的信息,就执行该机器代码段,直到所述存于存储数据的存储区的程序代码内容片段所对应的任务完成。
文档编号G06F9/45GK1503127SQ0213582
公开日2004年6月9日 申请日期2002年11月20日 优先权日2002年11月20日
发明者刘丁阳 申请人:刘丁阳, 厦门神速信息通讯技术有限公司