天嵌 ARM开发社区

 找回密码
 注册
查看: 4528|回复: 8

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

[复制链接]
starrydzf 发表于 2010-9-14 19:11:06 | 显示全部楼层 |阅读模式
摘录: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也是很重要的过渡的一步啊!!
天嵌_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 | 显示全部楼层
厉害,膜拜!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2024-11-1 07:43 , Processed in 1.046875 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表