帖子中程式如下:
#include
void delay();
int i=0,count=0;
void main()
}void delay(count)
=====================
cmd檔案如下:
-l rts2800.lib
-stack 400h
-heap 400h
memory
sections
其中,使用環境為軟**環境(simulator)。正如程式中注釋提到的,使用puts可以在stdout輸出視窗中看到相關輸出,而用printf則不行。
使用printf報錯如下:trouble running target cpu: can't read from data memory 0x10000, check memory config [-2185]
解決辦法:將rts2800.lib改為rts2800_ml.lib,使用大記憶體模式之前,只能訪問程式區的前64k(從錯誤的提示記憶體0x1000=64k就可以看出來),而程式區分配的段是以0x3f8000開始,由此可知printf函式定址時需要訪問64k之外儲存段,故會產生訪問錯誤。而改為大記憶體模式之後,就可以訪問64k之後的儲存段了,故修改之後可以執行。
對於puts而言,不修改相應的庫檔案至rts2800_ml.lib,程式也可以正常產生輸出,因為字串常量「hello world!/n」是儲存在資料段的低64k(const、econst),而puts函式內部訪問機制應該和printf不同,它定址時不需要訪問64k之外的資料。將econst分配在高64k時,puts是不能正常輸出的,這證明了相關猜想。
進一步,可以將cmd檔案修改如下:
-l rts2800_ml.lib
-stack 400h
-heap 400h
memory
sections
{/* allocate program areas: */
.reset : > pramh0, page = 0
.text : > pramh0, page = 0
.cinit : > pramh0, page = 0
.cio : > draml1, page = 1
//.codestart : > pramh0, page = 0
/* allocate data areas: */
.stack : > ramm0|ramm1, page = 1
.bss : > draml1, page = 1
.ebss : > draml0, page = 1
.const : > draml0, page = 1
.econst : > draml0, page = 1
.sysmem : > draml0, page = 1
/* allocate peripheral frame 0 register structures: */
devemuregsfile : > dev_emu, page = 1
flashregsfile : > flash_regs, page = 1
csmregsfile : > csm, page = 1
xintfregsfile : > xintf, page = 1
cputimer0regsfile : > cpu_timer0, page = 1
cputimer1regsfile : > cpu_timer1, page = 1
cputimer2regsfile : > cpu_timer2, page = 1
piectrlregsfile : > pie_ctrl, page = 1
pievecttablefile : > pie_vect, page = 1
/* allocate peripheral frame 2 register structures: */
ecanaregsfile : > ecan_a, page = 1
ecanamboxesfile : > ecan_ambox page = 1
/* allocate peripheral frame 1 register structures: */
sysctrlregsfile : > system, page = 1
spiaregsfile : > spi_a, page = 1
sciaregsfile : > sci_a, page = 1
xintruptregsfile : > xintrupt, page = 1
gpiomuxregsfile : > gpiomux, page = 1
gpiodataregsfile : > gpiodat page = 1
adcregsfile : > adc, page = 1
evaregsfile : > ev_a, page = 1
evbregsfile : > ev_b, page = 1
scibregsfile : > sci_b, page = 1
mcbsparegsfile : > mcbsp_a, page = 1
/* csm password locations */
csmpwlfile : > csm_pwl, page = 1
這樣之後,就具有了通用性,在軟體**和硬體**環境下都能執行了,只是在硬體**環境下執行printf會占用不少資源,似乎可用性不高。
關於F2812中的EALLOW和EDIS指令
ti 的 dsp 為了提高安全效能,將很多關鍵暫存器作了保護處理。通過狀態暫存器 1 st1 的位6設定與復位,來決定是否允許dsp指令對關鍵暫存器進行操作。這些關鍵暫存器包括器件 暫存器 flash暫存器 csm暫存器 pie 向量表 系統控制暫存器 gpio mux 暫存器 ecan 暫存器的一...
centos 5 3中用yum安裝MPlayer
centos 5.3中用yum安裝mplayer 1 編輯 etc yum.repos.d centos base.repo 首先備份原來的源配置檔案為 centos base.repo.bak cp etc yum.repos.d centos base.repo etc yum.repos.d ...
在struts2中用這個tag
我在hiredmyway中有個抽象的類defaultaction繼承actionsupport 有個標籤庫用來保持顯示錯誤的資訊的乙個方法 public abstract class defaultaction extends actionsupport 用這麼乙個方法 listerrormessa...