您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> [已解决]关于编译器优化 Enable optimizati... 
本帖共有376个阅读者
发表帖子 发表投票 回复主题
[已解决]关于编译器优化 Enable optimization
slackman(论坛新手)
slackman
头衔:社区公民
帮派:无帮无派
帖数:10
金钱:182
积分:14
注册时间:2017/4/29
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
[已解决]关于编译器优化 Enable optimization
用 BF533 光盘里的 BF53x_CMOS_LCD24 例程,正常编译 load 后正常

但是开发板重新上电,然后在 Project Option 中 勾选“Enable optimization”后,load  dxe 程序,图像无法显示。屏幕上为灰色

比较奇怪的是先加载正常dxe,再加载 优化后的 dxe,图像会正常显示。

请问有谁知道是什么有原因导致这个问题吗?


编译器优化后计算速度会提升很多,所以我想在我的工程里启用这个选项。



「该帖子被 slackman 在 2017-06-14 16:33:45 编辑过」

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2017/6/12 17:28:13
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
是开了优化开关后,延时函数被优化,导致硬件时序改变。必须在硬件驱动函数前面加上防优化开关,避免优化

我是OP...
等级:管理员 参考IP地址:*.*.*.*
2017/6/13 9:58:24
slackman(论坛新手)
slackman
头衔:社区公民
帮派:无帮无派
帖数:10
金钱:182
积分:14
注册时间:2017/4/29
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
多谢OP回复

您说的防优化开关应该是 #pragma optimize_off 吧,请问应该加到哪里呢? 跟采集相关的有以下几个函数

/****************************************************************************
* 名称 :Video_Frame_Capture
* 功能 : 初始化PPI控制器 初始化DMA0控制器
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void   Video_Frame_Capture(void)
{
*pPPI_FRAME = 480;  
*pPPI_COUNT = 1279;
*pPPI_DELAY = 0;
*pPPI_CONTROL = 0x01AC;
*pDMA0_START_ADDR = ydata_buffer;
*pDMA0_X_COUNT = 640;
*pDMA0_X_MODIFY = 0x1;
*pDMA0_Y_COUNT = 480;
*pDMA0_Y_MODIFY = 0x1;
*pDMA0_PERIPHERAL_MAP = 0x0;
*pDMA0_CONFIG =  WNR | WDSIZE_8| DMA2D | RESTART | DI_EN;
*pDMA0_CONFIG |= DMAEN;
ssync();
*pPPI_CONTROL |= PORT_EN;
ssync();
}



/****************************************************************************
* 名称 :EX_INTERRUPT_HANDLER
* 功能 : 中断函数 清 DMA  中断标志,关PPI
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
EX_INTERRUPT_HANDLER(DMA0_PPI_ISR)
{
int i,j;
*pDMA0_IRQ_STATUS = 0x1;  
for(i=0;i<320;i++)
{
for(j=0;j<240;j++)
{
DisplayBuffer_565[2*(240*i+j)+1] = ydata_buffer[640*i+j]&0xf8;
DisplayBuffer_565[2*(240*i+j)+1] |= (ydata_buffer[640*i+j]>>5)&0x07;
DisplayBuffer_565[2*(240*i+j)+0] = (ydata_buffer[640*i+j]<<3)&0xe0;
DisplayBuffer_565[2*(240*i+j)+0] |= (ydata_buffer[640*i+j]>>3)&0x1f;
}
}
Write_pic(0,DisplayBuffer_565);     
    Video_Frame_Capture();   
}

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2017/6/13 10:24:00
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
加到延时函数前面

我是OP...
等级:管理员 参考IP地址:*.*.*.*
2017/6/13 14:53:35
slackman(论坛新手)
slackman
头衔:社区公民
帮派:无帮无派
帖数:10
金钱:182
积分:14
注册时间:2017/4/29
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
问题解决了,多谢

这个demo里一共两个延时函数,一个是液晶驱动 9325TP.c 里的 delays(),另外是 i2c.c里的 delay_ns()

调试发现是 i2c.c 里的延时函数被优化,导致 cmos 初始化失败。 液晶初始化的延时倒是不影响。

保险起见,两个函数的定义前面都加上 #pragma optimize_off,嗯 : D

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2017/6/14 10:16:12
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.154532 Call, 1 Queries, Processed in 0.031250 second(s),