在這篇文章中提到,在開發板上電後,會出現“raise: Signal # 8 caught”。這雖然不影響系統的正常運行,但也是一個不小的bug,也許會影響以後u-boot-2011.06的移植,因此我們有必要把這個bug去除掉。
相關閱讀:
U-Boot源代碼下載地址 http://www.linuxidc.com/Linux/2011-07/38897.htm
U-Boot-2011.06啟動流程分析 http://www.linuxidc.com/Linux/2011-07/39310.htm
u-boot-2011.06在基於s3c2440開發板的移植之編譯配置 http://www.linuxidc.com/Linux/2011-10/45455.htm
u-boot-2011.06在基於s3c2440開發板的移植之NorFlash啟動 http://www.linuxidc.com/Linux/2011-10/45456.htm
u-boot-2011.06在基於S3C2440開發板的移植之解決raise: Signal # 8 caught http://www.linuxidc.com/Linux/2011-10/454554.htm
u-boot-2011.06在基於s3c2440開發板的移植之支持NandFlash讀寫 http://www.linuxidc.com/Linux/2011-10/45457.htm
u-boot-2011.06在基於s3c2440開發板的移植之硬件ECC http://www.linuxidc.com/Linux/2011-10/454558.htm
其實把這個bug去掉也很簡單,就是把time.c(在arch/arm/arm920t/s3c24x0目錄下)這個文件中的四個全局變量用gd這個數據結構中的4個相關成員代替就可以了,具體的就是:
timer_load_val用gd->timer_rate_hz替代;
timer_clk用gd->tbl替代;
timestamp用gd->timer_reset_value替代;
lastdec用gd->lastinc替代。
下面我們就列出time.c這個文件具體需要修改的地方:
去掉第38行和第39行關於timer_load_val和timer_clk這兩個變量的聲明,並加上下面代碼:
38:DECLARE_GLOBAL_DATA_PTR;
去掉第49行和第50行關於timestamp和lastdec這兩個變量的聲明;
去掉第60行至第68行語句(if (timer_load_val == 0)的判斷內容),改為:
60:gd->timer_rate_hz = get_PCLK() /(2*16*100);
61:gd->tbl = get_PCLK() / (2 * 16);
剩下需要修改的內容就是具體的變量替換,其中每條語句前面的行號為源文件的行號:
70:gd->lastinc = gd->timer_rate_hz;
71:writel(gd->timer_rate_hz,&timers->tcntb4);
78:gd->timer_reset_value = 0;
99:gd->timer_reset_value = t;
108:tmo *= (gd->timer_rate_hz * 100);
118:gd->lastinc = READ_TIMER();
119:gd->timer_reset_value = 0;
126:return tmr / (gd->tbl / CONFIG_SYS_HZ);
137:tmo *= (gd->timer_rate_hz * 100);
140:tmo = usec * (gd->timer_rate_hz * 100);
160:if (gd->lastinc >= now) {
162:gd->timer_reset_value += gd->lastinc -now;
165:gd->timer_reset_value += gd->lastinc + gd->timer_rate_hz- now;
167:gd->lastinc = now;
169:return gd->timer_reset_value;
181:tbclk = gd->timer_rate_hz * 100;
通過上述的修改,我們再上電啟動後,就不會再有raise: Signal # 8 caught了。