2812中用printf和puts輸出的相關問題

2021-09-30 04:46:38 字數 3059 閱讀 7221

帖子中程式如下:

#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...