早在今年8月份的時候就將jpeg解碼弄好了,但是一直以來非常的不穩(wěn)定,如果修改了任意地方的代碼都會造成解碼可能失敗,起初我以為是堆棧問題,或者后面有非法指針,但是都沒得到結果,最后讓我只能懷疑編譯器了,而且我同樣的程序使用了RVDS4.0編譯后JPEG解碼老是等待超時,但是可以解碼頭部,得到相關的JPEG信息,就是無法解碼圖片主體部分,我換到RVDS2.2上面竟然解碼成功了,同樣的程序,不同的編譯器結果不一樣,讓我對RVDS4.0十分的失望,但是無意間我發(fā)現(xiàn)RVDS2.2也出現(xiàn)修改無關代碼后JPEG無法解碼了,我意識到我錯怪RVDS4.0了,我開始另想辦法了,當我仔細閱讀S3C6410 dataset的后,終于找到一線希望了,文中說道,JPEG CODE最高時鐘不能超過66MHz,我當時就修改了JPEG的時鐘分頻,給的是4分頻,剛好是66MHz,恰在此時解碼又成功了,讓我高興了不久,沒過多大一會,又悲劇了,打印的信息顯示解碼失敗,等待超時,我開始懷疑是編譯的地址,我就開始打印各個緩沖區(qū),指針,變量的地址,最終發(fā)現(xiàn)了一個問題,就是只有源圖像地址的那個指針如果最后一位為0(16進制),解碼就成功了,試了很多次,這個結論是對的,最終找出了問題所在了,源圖像地址必須是16字節(jié)地址對齊的,這就能解釋我之前遇到的種種不可思議的問題了。
很高興,只要添加一句代碼就能解決這個問題了,因為32bit的CPU,編譯器默認是32位對齊的。
if(JpgAddr%16)//源地址一定要是16字節(jié)(128位)對齊的,否則會出現(xiàn)各種意想不到的問題,這個問題困擾了我5個多月。
JpgAddr=(JpgAddr/16+1)*16;
這樣,可以在申請了源圖像緩沖區(qū)后,使用一個指針,指向這個緩沖區(qū)起始位置最近的那個128位對齊的地址,即可解決這個問題。