|
摘录:Warning : C2892E: signed constant overflow解决方法2010-04-26 12:51这个警告应该使用了这样的形式:1<<x;造成的,(x可能等于31,1可能为其它数,这里只是示例);编译器将这个1当作有符号数(所以提示signed)了,可改为如下形式:
例:IO0SET=((uint32)1)<<x;
即可消除这个警告!
上面一段是抄的,实际改动的时候,有所变动,改成U32
第1个警告:rCIGCTRL |= ((U32)1<<31); //camera I/F soft reset
编译后剩10个警告
改成rCIGCTRL &= ~((U32)1<<31);
剩9个
改成rCISRCFMT=((U32)CAM_ITU601<<31)|(0<<30)|(0<<29)|(CAM_SRC_HSIZE<<16)|(CAM_ORDER_YCBYCR<<14)|(CAM_SRC_VSIZE);
下面依次改成
rCICOTRGFMT=((U32)CAM_CODEC_IN_422<<31)|(CAM_CODEC_OUTPUT<<30)|(CoDstWidth<<16)|(CAM_FLIP_180<<14)|(CoDstHeight);
rCIPRSCCTRL=((U32)1<<31)|(CAM_PVIEW_OUTPUT<<30)|(ScaleUp_H_Pr<<29)|(ScaleUp_V_Pr<<28)|(MainHorRatio<<16)|(MainVerRatio);
这一句要注意:
if(mode&CAM_CAMIF_GLOBAL_CAPTURE_ENABLE_BIT) {
在CAM_CAMIF_GLOBAL_CAPTURE_ENABLE_BIT这句上,右键,go to macro
改成:#define CAM_CAMIF_GLOBAL_CAPTURE_ENABLE_BIT ((U32)1<<31)
警告由6变3
下一个警告信息:'buffer_y' written twice without intervening sequence point……
原因是这句的传参引起的,传参的时候用了自变量加1,原句如下:
rgb_data0 = Conv_YCbCr_Rgb(*buffer_y++, *buffer_y++, *buffer_cb++, *buffer_cr++);
修正方法:在声明buffer_y的地方,即574行,多声明一个临时变量:
U8 *buffer_y, *buffer_y_temp, *buffer_cb, *buffer_cr;
回到出现警告的地方,上下改动,如下:
for (x=0;x<size_x;x+=2)
{
*buffer_y_temp = *buffer_y+1;
rgb_data0 = Conv_YCbCr_Rgb(*buffer_y, *buffer_y_temp, *buffer_cb++, *buffer_cr++);
*buffer_y = *buffer_y+2;
frameBuffer16BitTft240320[y][x/2] = rgb_data0;
多加了两行,效果和“(*buffer_y++, *buffer_y++,”
是一样的
编译后,在else的地方出现警告,同样处理,处理后如下
#else
for (y=0;y<size_y;y++) // YCbCr 4:2:2 format
{
for (x=0;x<size_x;x+=2)
{
*buffer_y_temp = *buffer_y+1;
rgb_data0 = Conv_YCbCr_Rgb(*buffer_y, *buffer_y, *buffer_cb++, *buffer_cr++);
*buffer_y = *buffer_y+2;
LCD_BUFFER[y][x/2] = rgb_data0;
//Uart_Printf("%08x\n", rgb_data0);
//---
}
}
编译后无警告,大功告成!!
我在看教程的时候,教程说:有些警告是无法避免的!
证明这句话是错的,有警告的程序是不够强壮的。
还有,TQ2440测试程序有很多ucos的影子,为什么不出些ucos的教程,ucos也是很重要的过渡的一步啊!! |
|