• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

问个简单的C语言问题(讨论)

dos 2016-12-22 浏览量:1223

我按照以往编程方法:正常情况下,它说我的data超过了128


如果改成这个样子,那么编译不会提示有出错了。①那么我想问下以前我是用variables in data在程序中声明变量是这样声明的int a;那么现在我已经改成variables in xdata是不是程序中声明变量就要这样声明int xdata a;?②那么其它模块调用本模块变量是不是也要这样声明:extern int xdata a;?③改成variables in xdata会有什么变化呢?或者要注意些什么问题呢?​

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 還是整個理解比較好,以下是51編譯用的幾個Memory block

    記憶體種類

    typeSDCCinstructionsizeaddressing
    (A) program__codeMOVC64Kindex direct
    (B) external__xdataMOVX64Kindirect
    (C) internal(80~FF)__idataMOV128indirect
    (C) SFR(80~FF)__sfrMOV128direct
    (C) internal(0~7F)__dataMOV128direct/indirect

    記憶體定址

    typereadwriteregister
    directMOV Rn,direct
    MOV direct,direct
    MOV direct,Rn
    MOV direct,@DPTR
    MOV direct,#data
    R0~R7,A
    indirectMOV direct,@Ri
    MOVX A,@DPTR
    MOV @Ri,direct
    MOVX @DPTR,A
    MOV @Ri,#data
    R0,R1,DPTR,A
    index directMOV A,#30h
    MOV DPTR,#300H
    MOVC A,@A+DPTR
    XA,DPTR

    1. Ri=R0,R1,Rn=R0~R7。
    2. 索引定址法 (index direct) 只能用在程式記憶體,而且不能寫入,只能讀取到 A。
    3. 外部記憶體只能使用間接定址法 (indirect),而且只能透過 Ri/DPTR/A 三者傳遞數值,如果要寫入數值,只能把值先存入 A,再由 A 寫入 DPTR/Ri。
    4. 內部記憶體不論間接或直接都可以直接把數值寫入,不需要透過 A,當然要經由 A 也是可以。
    如果ASM Code還太難先不用看,不過要理解間接定址跟直接定址差異,接著講各變數宣告方法和差異,SDCC指編譯器

    type
    變數型態


    located
    指向位址
    pointerphysical
    變數位址
    name
    unsigned charxdata*datap

    這裡我們用Pointer當範例,因為c語言中Pointer最重要,也最易搞混

    指標分類

    1. unsigned xdata char * data p;
      指向外部記憶體的指標變數,變數存放在內部記憶體。

    2. unsigned char data * xdata p;
      指向內部記憶體的指標變數,變數存放在外部記憶體。

    3. unsigned char code * xdata p;
      指向程式記憶體的指標變數,變數存放在外部記憶體。

    4. unsigned char code * code p;
      指向程式記憶體的指標變數,變數存放在程式記憶體,指標變數是唯讀,所以必須先設定初始值

    5. unsigned char * xdata p;
      指向任何記憶體的指標變數 (generic pointer),變數存放在外部記憶體。

    6. unsigned char * p;
      指向任何記憶體的指標變數 (generic pointer),變數存放由 memory model 決定。

    7. char (* data fp)(void);
      指向程式記憶體的函數指標變數,變數存放在內部記憶體。函數指標變數只能指向程式記憶體,無法修改喔

    8. 由於內部記憶體指標讀取都是使用間接定址 (indirect addressing),所以無法存取 SFR 空間的記憶體內容。

    指標變數大小

    data1
    xdata2
    code2
    generic pointer3

    所以看完以上的宣告關係,您可以知道差異在哪,以下是問題了

    1. 沒錯,變數存放在xdata

    2. 一樣唷,之前解答有很詳細的說明//www.icxbk.com/ask/detail?tid=2243,定義在h標頭檔,其中一個c檔案明確定義,則其他c檔案就可以引用,會指向同一個變數a

    3. 可參考上面講解的內部資料記憶體(xdata)和外部資料記憶體(data),定址方式和ASM Code差異,C語言上看不出來,但ASM Code的指令集會不一樣(MOVX/MOV)

    4.

    int a; //會存放在內部資料記憶體,即data
    extern int a;//extern宣告需上下對應
    5.

    看看您宣告哪些變數,像sbit/bit這些小於1byte的會變成小數,在xdata的size會增加,Program size: data= , xdata=, code= 分別代表三個區塊記憶體占用大小(byte為單位)

    以上應該很清楚的整個脈絡,加油

    • 发布于 2016-12-22
    • 举报
    • 评论 1
    • 2
    • 0
MOP 回复了 MOP:內部資料記憶體(data)和外部資料記憶體(xdata) ^___^" 回复

其他答案 数量:6
  • 1、

    是的。

    2、

    是的。

    3、

    xdATa: 外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。

    4、

    extern int xdata a

    5、

    或是运行时产生的临时变量会在内部ram中的。也就是data占用的。

    • 发布于2016-12-22
    • 举报
    • 评论 0
    • 1
    • 0

  • 该错误提示说明data空间已经不够用,原因是你可能有好多函数,而函数内部的局部变量又没有定义其空间,这种情况下,系统会将变量分配到你在Otions for Target 对话框里的设置的空间。如果你在下图所示中的 Memory Model 里设置成 Small:variables in DATA,则DATA空间很快便用完,导致data空间不够用。

    解决的办法有两种,一是通过更改Memory Model设置,可以设置成pdata或xdata,以便有足够大的空间,但这又带来新的问题,程序运行速度减慢,而且code代码也会加大,因为如果一个局部变量被存放在了xdata空间,汇编语言访问xdata空间的代码大小要比访问data空间的代码大,变量一旦很多,程序的代码也会逐渐增大;二是根据自己的要求设置变量的空间。

    所以这涉及到代码优化的问题,遇到具体问题时,在运行速度和代码大小之间取得适合自己的情况。

    • 发布于2016-12-23
    • 举报
    • 评论 0
    • 1
    • 0

  • ④如果我不想改成variables in xdata,而是想继续用variables in data方法,那么程序是不是这样声明:int xdata a;然后有其它模块想调用a变量,是不是就要这样声明:extern int xdata a;还是这样声明:extern int a;?
    • 发布于2016-12-22
    • 举报
    • 评论 0
    • 0
    • 0

  • ⑤还有个问题:为什么我都改成variables in xdata了,但是编译结果还是说:program size:data=30.6这里面的30.6是怎么冒出来的。
    • 发布于2016-12-22
    • 举报
    • 评论 0
    • 0
    • 0

小白1231 回复了 小白1231 :1 回复

相关问题

问题达人换一批

问个简单的C语言问题(讨论)