国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

電子工程網

標題: 循環直接跳過,貌似溢出了,但是我用的是32bit類型啊! [打印本頁]

作者: wangkj    時間: 2009-7-15 16:50
標題: 循環直接跳過,貌似溢出了,但是我用的是32bit類型啊!
#define     WIDTH       1024
#define     HIGH        768

void clr_scr(void)
{
   unsigned long int i;
   for (i=0;i<(unsigned long int)(WIDTH*HIGH*8*2);i++)
   {
         MOSI=0;
      SPCK=1;
      SPCK=0;
   }
}

循環直接跳過,貌似溢出了,但是我用的是32bit類型啊!
作者: wangkj    時間: 2009-7-15 16:51
難道每個數字后面都跟個L?但是,非32bit類型咋辦?
定義兩個?
作者: 宇宙飛船    時間: 2009-7-15 17:00
可用sizeof ( unsigned long int) 測試編譯器對unsigned long int支持的長度。
作者: wangkj    時間: 2009-7-15 17:02
這個倒是沒問題,應該是32bit的。
作者: wangkj    時間: 2009-7-15 17:02
(WIDTH*HIGH*8*2) 強制成32bit才是關鍵。
作者: 宇宙飛船    時間: 2009-7-15 17:05
老王別教壞小朋友了。
作者: wangkj    時間: 2009-7-15 17:06
版主跑哪里去了,香腸呢?這都是51高手啊。
作者: wangkj    時間: 2009-7-15 17:07
程序源碼

src.rar

50.06 KB, 下載積分: 積分 -1


作者: wangkj    時間: 2009-7-15 17:08
昨天是 for(i=0;i<97;i++) for(j<0;j<255;j++) for(k<0;k<255;k++) 這樣清屏的
這樣速度最快!
但是,最開始用的就是32bit int,是正常的。
這個俺想不起來咋辦了。

難道都需要增加  L  標志符?

模擬執行,鼠標右鍵,選擇顯示匯編代碼。
作者: Netjob    時間: 2009-7-15 17:26
哈哈,估計樓主用ADS吧?  ADS有這個稀里糊涂的毛病。
作者: wangkj    時間: 2009-7-15 17:26
addr的值是0!!!!

clr_scr.jpg (14.1 KB)

clr_scr.jpg

作者: wangkj    時間: 2009-7-15 17:30
不用宏,照樣!

clr_scr2.jpg (9.33 KB)

clr_scr2.jpg

作者: Netjob    時間: 2009-7-15 17:34
幫樓主在 ADS1.2 下 軟件仿真,沒問題。 圖:

WKJ-1.JPG (59.56 KB)

WKJ-1.JPG

作者: wangkj    時間: 2009-7-15 17:39
俺這個是keil c,51的軟件。
你用arm的系統,純32位的,當然沒問題了。

或許,換個別的版本的編譯器,也沒準正常,俺這個是keil c 8.18的。
作者: Netjob    時間: 2009-7-15 17:47
這個 擺明就是數據溢出了, 對 數據異常的 判斷 編譯器都作  FALSE 處理!?
作者: 本分書生    時間: 2009-7-15 17:59
來順(31726560) 17:43:38
我想應該是編譯是解釋的次序問題
來順(31726560) 17:54:50
已經找到錯誤了,是宏定義的問題
應該寫為#defined WITH 1024L
注意L必須加
來順(31726560) 17:55:30
應為keil是先算1024*768*8*2,然后才轉換為long,所以編譯出了問題



問題可以終結了
作者: 本分書生    時間: 2009-7-15 18:01
也就是說要keil要寫成1024L*768L*8*2
作者: phoenixmy    時間: 2009-7-15 18:06
學習了

很有價值,頂
作者: wangkj    時間: 2009-7-15 18:36
或許,寫成8L * 2 * 1024 * 768也沒準可以。
作者: wangkj    時間: 2009-7-15 19:04
另外,誰有簡單的圖形測試程序,51下的,給我一份。
類似turbo c的bgi demo就行。或者更簡單也好。
例如畫線,園,三角方塊等等的。
作者: phoenixmy    時間: 2009-7-15 19:45
可以多試試

加了L應該就沒有問題
作者: wangkj    時間: 2009-7-16 08:45
果然可以了,只需要最前面,加上 1L * 就可以!

clr_scr3.jpg (12.24 KB)

clr_scr3.jpg

作者: phoenixmy    時間: 2009-7-16 09:18
看來keil會把define中的內容默認為最匹配的數據類型,挺節約的,呵呵
作者: 一朝成名    時間: 2009-7-16 09:28
看來以后宏定義也要注明類型
太繁瑣了~
作者: phoenixmy    時間: 2009-7-16 09:33
其實這樣做并不是繁瑣,呵呵,看來keil還是很聰明的,為了幫助節省資源,會自動選擇數據類型,只是用的時候要小心
作者: phoenixmy    時間: 2009-7-16 09:33
這幾天看了21上單片機版面的置頂貼,講程序優化的,感覺前人總結的
高內聚,低耦合,模塊功能要單純
真是經典


呵呵,跑題了
作者: 一朝成名    時間: 2009-7-16 09:38
建議ls讀一下《Unix編程藝術》
你就知道那些東西不過爾爾~

做硬件的跟純做軟件的專業水準是比不了的  哈哈~
作者: wangkj    時間: 2009-7-16 09:47
有出錯了,還是int 32的問題,高16bit丟了!

void cursor(unsigned int x,y)  //設置顯存地址 8M 尋址空間。
{
   //int i;
   union
   {
      unsigned long int addr;
          unsigned int addr_HL[2];
   } addr_union;
   addr_union.addr=1L*y*WIDTH+x;
   EA0=1;//set cmd status
   //addr=272*y+x;
   spi_write16(addr_union.addr_HL[1]);  
   spi_write16(addr_union.addr_HL[0]);  

   EA0=0;//set data status        PutCmd(0);//reset display ram pointer to 0
}
作者: wangkj    時間: 2009-7-16 09:48
>>> hex(0x201*1024+0x201)='0x80601'

把0x80丟了!
作者: wangkj    時間: 2009-7-16 09:50
結果輸出的圖。

int32_1.jpg (14.93 KB)

int32_1.jpg

int32_1.jpg (14.93 KB)

int32_1.jpg

作者: Netjob    時間: 2009-7-16 10:00
應該還是 那類問題吧~?  8位機確實比較費勁~
作者: machunshui    時間: 2009-7-16 10:04
這是一個很好討論,

請問一下wangkj,編譯器難道沒有警告嗎?

要是沒有警告的話,

應該就算編譯器的BUG了吧?
作者: wangkj    時間: 2009-7-16 10:10
51 vga的圖片,vga部分的接口引出,可以不用板載的51

img026.jpg (15 KB)

img026.jpg

作者: wangkj    時間: 2009-7-16 10:11
Build target 'Target 1'
compiling serial.c...
compiling vga51.c...
linking...
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?GET_CHAR?SERIAL
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?CO?SERIAL
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?NOP?VGA51
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?UDELAY?VGA51
Program Size: data=213.1 xdata=0 code=985
creating hex file from "vga51"...
"vga51" - 0 Error(s), 4 Warning(s).
作者: wangkj    時間: 2009-7-16 10:12
這幾個警告沒用,都是我注釋掉的函數。
作者: wangkj    時間: 2009-7-16 10:13
keil c51真的很垃圾,int32 不讓用,純粹是想斷單片機的后路。
作者: machunshui    時間: 2009-7-16 10:14
有沒有設置成最嚴格的警告方式?
作者: machunshui    時間: 2009-7-16 10:15
瞎猜的,不知道KEIL有沒有這樣的設置
作者: wangkj    時間: 2009-7-16 10:19
源碼在附件中。

src.rar

50.76 KB, 下載積分: 積分 -1


作者: wangkj    時間: 2009-7-16 10:25
void cursor(unsigned int x,y)  //設置顯存地址 8M 尋址空間。
{
   //int i;
   union
   {
      unsigned long int addr;
          unsigned int addr_HL[2];
   } addr_union;
   addr_union.addr=1L*(long)y*WIDTH+(long)x;
   EA0=1;//set cmd status
   //addr=272*y+x;
   spi_write16(addr_union.addr_HL[1]);  
   spi_write16(addr_union.addr_HL[0]);  

   EA0=0;//set data status        PutCmd(0);//reset display ram pointer to 0
}
作者: wangkj    時間: 2009-7-16 10:26
addr_union.addr=1L*(long)y*WIDTH+(long)x;

加上 long 強制轉換就能搞定!

int32_2.jpg (11.83 KB)

int32_2.jpg

作者: wangkj    時間: 2009-7-16 10:27
keil c 用 long類型得十分注意才行啊。
作者: 李冬發    時間: 2009-7-20 13:18
右式第一個參數為long型就可以了。
作者: wangkj    時間: 2009-7-20 15:32
必須都加long才行。




歡迎光臨 電子工程網 (http://www.qingdxww.cn/) Powered by Discuz! X3.4
主站蜘蛛池模板: 亚洲欧美日韩综合二区三区 | 国产日韩第一页 | 1000部羞羞视频在线看视频 | 欧美理论影院在线观看免费 | 日本黄在线 | 日日干狠狠操 | 日韩精品欧美在线 | 日日噜噜夜夜狠狠视频buoke | 欧美成人一区二区三区不卡视频 | 亚洲不卡av不卡一区二区 | 日本高清高色 | 欧美一区二区三区久久久 | 亚洲黄色激情视频 | 色阁五月| 麻豆国产一区二区在线观看 | 欧美aⅴ片 | 年轻的嫂子在线线观免费观看 | 五月婷婷基地 | 亚洲视频二区 | 正在播放国产无套露脸 | 天堂网视频在线观看 | 日本成人免费在线视频 | 日韩国产欧美一区二区三区在线 | 久久夜色精品国产 | h漫免费 | 啦啦啦www在线观看播放高清 | 四虎4444hu4影视最新地址 | 欧美男人天堂 | 国产第一页在线观看 | 欧美大片大片播放网站 | 国产精品1区2区3区在线播放 | 国产三级第一页 | 精品麻豆 | 久久久精品2021免费观看 | 中文字幕一区二区三区在线观看 | 天天爽夜夜爽一区二区三区 | 国产亚洲精品日韩香蕉网 | 青青草香蕉 | 亚欧乱色视频大全 | 在线看片 在线播放 | 日韩高清在线二区 |