starrydzf 发表于 2010-9-14 19:11:06

分享:完美编译,无警告,TQ2440测试程序

摘录: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 = 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 = rgb_data0;
                        //Uart_Printf("%08x\n", rgb_data0);
                //---
                }
        }

编译后无警告,大功告成!!
我在看教程的时候,教程说:有些警告是无法避免的!
证明这句话是错的,有警告的程序是不够强壮的。
还有,TQ2440测试程序有很多ucos的影子,为什么不出些ucos的教程,ucos也是很重要的过渡的一步啊!!

天嵌_support1 发表于 2010-9-14 19:34:10

1# starrydzf


不错,很有探讨精神!!顶你。

starrydzf 发表于 2010-9-20 18:22:35

最近在学UCOS,有这么一句: ptcb->OSTCBY         = (INT8U)(prio >> 3);   
根据它的风格,上面移位改动的时候也用这种格式会更好,如
rCIGCTRL |= (1<<31); 改成rCIGCTRL |= (U32)(1<<31);
而,括号里面用U32而不用U16 U8的原因是因为后面的:<<31

starrydzf 发表于 2010-9-20 18:26:17

关于U32到底是什么,大家可以在编译之后,在出现U32的地方点GO TO跳过去看它的宏定义

无人地铁 发表于 2012-4-25 00:53:59

这个文章是在百度的时候跳过来发现的,楼主这种完美主义,正是我等小辈追求的!
小弟膜拜,同时在今后把楼主无私奉献精神分享给更多志同道合的童鞋!一起把中国的嵌入式推向更高层!
                                                                                             -------追寻前辈的足迹,踏向征途~

无人地铁 发表于 2012-4-25 00:55:59

书中自有颜如玉,值得你看!

netbird 发表于 2012-5-3 08:55:04

追求完美是我的追求。

HARRY007 发表于 2012-9-30 23:43:19

好厉害,膜拜啊

夏雨 发表于 2013-2-26 12:02:04

厉害,膜拜!
页: [1]
查看完整版本: 分享:完美编译,无警告,TQ2440测试程序