30天自制OS筆記(二)10~20天內容中遇到的問題

第11天,消除閃爍

依舊是最原始版本和優化過的沒有啥子區別,還是老樣子

在第13-16天中,主要處理的是定時器和任務調度問題,糾結了一陣子。

書中說提高任務的優先級可以使得任務多執行,但是從代碼的角度感覺不出來,

現在的理解是,有個全局的定時器,在切換任務的時候看做是另一個局部的定時器,在switch的時候,會以當前task的優先級重置定時器,優先級越高,運行的時間就越長。


第17天,添加tab切換任務

在sheet_refresh(sht_win, 0,0,sht_win->bxsize,21);中把sht_win寫成了buf_win導致切換的時候圖層沒有刷新。


第18天,發現一個bug:

else
	{//滾動
		for(y=28; y<28+112;y++)
			for(x=8;x<8+240;x++)
				sheet->buf[x+y*sheet->bxsize]=sheet->buf[x+(y+16)*sheet->bxsize];
		for(y=28+112; y<28+128; y++)
			for(x=8; x<8+240;x++)
				sheet->buf[x+y*sheet->bxsize]=COL8_000000;
		sheet_refresh(sheet, 8, 28, 8+240, 28+128);
	}

這樣寫有問題,make run可以看一下,在滾動的時候向上一行一行復制的時候會把光標也複製上去,所以除了將最後一行塗黑之外,複製的時候不能正行的複製,而需要複製到當前光標處纔行:修改如下:
	else
	{//滾動
		for(y=28; y<28+112-16;y++)
			for(x=8;x<8+240;x++)
				sheet->buf[x+y*sheet->bxsize]=sheet->buf[x+(y+16)*sheet->bxsize];
		for(y=28+112-16; y<28+122;y++)//最後一行的copy
			for(x=8;x<cursor_x;x++)
				sheet->buf[x+y*sheet->bxsize]=sheet->buf[x+(y+16)*sheet->bxsize];
		for(y=28+112; y<28+128; y++)
			for(x=8; x<8+240;x++)
				sheet->buf[x+y*sheet->bxsize]=COL8_000000;
		sheet_refresh(sheet, 8, 28, 8+240, 28+128);
	}

  過了一天發現好像是自己寫的時候錯了,其實在複製像素之前,已經將光標的哪一個長方形給抹去了,應該是自己不小心忘記的,如果不用抹去光標的話,那麼就只能自己處理最後一行的光標了,比較麻煩,而且在之後的處理過程中會出現複製不完全的情況,所以最簡單的辦法就是將光標抹去再複製。


這10天問題也不少,東西多了容易混,本來計劃着再重頭開始看下,想想還是算了,這周麼還有考試,就先這樣吧硬着皮頭湊活着看點,等過了一遍再說吧



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章