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