TI中文支持网
TI专业的中文技术问题搜集分享网站

增大采样点数出现卡顿

DSP增大采样数据点数后,LCD显示出现卡顿,显示不出数据。请问在配置文件中怎么更改。

Nancy Wang:

请再详细描述一下您的项目的具体细节以及LCD的配置部分。

qioa chen:

回复 Nancy Wang:

项目是重构物体振动波形;采集到电信号后,对采集到的点做时域分析,判断出输入信号的极值点,然后根据极值点来恢复物体振动波形。

LCD显示的代码粘贴如下

/****************************************************************************/
/**/
/*grlib_demo 测试*/
/**/
/*2014年08月07日*/
/**/
/****************************************************************************/
#include "hw_types.h"
#include "raster.h"
#include "psc.h"
#include "interrupt.h"
#include "TL6748.h"
#include "soc_C6748.h"
#include "hw_psc_C6748.h"
#include "i2c.h"
#include "grlib.h"
#include "widget.h"
#include "canvas.h"
#include "pushbutton.h"
#include "checkbox.h"
#include "radiobutton.h"
#include "container.h"
#include "slider.h"
#include "gpio.h"
#include "lcd.h"
#include "hw_syscfg0_C6748.h"/****************************************************************************/
/**/
/*宏定义*/
/**/
/****************************************************************************/
// LCD 时钟
#define LCD_SIZE 261156
#define LCD_CLK228000000#define PALETTE_OFFSET	4
#define FRAME_BUFFER_0	0
#define FRAME_BUFFER_1	1#define PINMUX18_GPIO8_10_ENABLE(SYSCFG_PINMUX18_PINMUX18_31_28_GPIO8_10 << \SYSCFG_PINMUX18_PINMUX18_31_28_SHIFT)/****************************************************************************/
/**/
/*全局变量*/
/**/
/****************************************************************************/
// LCD缓存初始化
#pragma DATA_ALIGN(g_pucBuffer, 4);
unsigned char g_pucBuffer[GrOffScreen16BPPSize(LCD_WIDTH, LCD_HEIGHT)];// 图形库显示结构
tDisplay g_sSHARP800x480x16Display;// 调色板
unsigned short palette_32b[PALETTE_SIZE/2] ={0x4000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u};// 全局显示上下文
tContext sContext;static void SetUpLCD(void);void LcdInit(void)
{unsigned int i = 0;unsigned char *dest;unsigned char *src;//中断初始化
//SetupIntc();// 注册中断服务函数IntRegister(C674X_MASK_INT6, LCDIsr);// 映射中断事件IntEventMap(C674X_MASK_INT6, SYS_INT_LCDC_INT);// 使能可屏蔽中断IntEnable(C674X_MASK_INT6);//LCD初始化SetUpLCD();// 配置基本框架RasterDMAFBConfig(SOC_LCDC_0_REGS,(unsigned int)(g_pucBuffer+PALETTE_OFFSET),(unsigned int)(g_pucBuffer+PALETTE_OFFSET) + sizeof(g_pucBuffer) - 2 -PALETTE_OFFSET, FRAME_BUFFER_0);RasterDMAFBConfig(SOC_LCDC_0_REGS,(unsigned int)(g_pucBuffer+PALETTE_OFFSET),(unsigned int)(g_pucBuffer+PALETTE_OFFSET) + sizeof(g_pucBuffer) - 2 -PALETTE_OFFSET, FRAME_BUFFER_1);src = (unsigned char *) palette_32b;dest = (unsigned char *) (g_pucBuffer+PALETTE_OFFSET);// 拷贝调色板到离屏显存中for( i = PALETTE_OFFSET; i < (PALETTE_SIZE+PALETTE_OFFSET); i++){*dest++ = *src++;}// 初始化离屏显存GrOffScreen16BPPInit(&g_sSHARP800x480x16Display, g_pucBuffer, LCD_WIDTH, LCD_HEIGHT);// 初始化显存上下文.GrContextInit(&sContext, &g_sSHARP800x480x16Display);// 使能LCD帧结束中断RasterEndOfFrameIntEnable(SOC_LCDC_0_REGS);// 使能光栅RasterEnable(SOC_LCDC_0_REGS);ConfigRasterDisplayEnable();}/*
** Configures raster to display image*/
static void SetUpLCD(void)
{unsigned int val;volatile unsigned int savePinMux = 0;PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_LCDC, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);LCDPinMuxSetup();savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(18)) & \~(SYSCFG_PINMUX18_PINMUX18_31_28);HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(18)) = \(PINMUX18_GPIO8_10_ENABLE | savePinMux);/*设置GPIO8[10]为输出模式*/GPIODirModeSet(SOC_GPIO_0_REGS, 139, GPIO_DIR_OUTPUT);GPIOPinWrite(SOC_GPIO_0_REGS, 139, GPIO_PIN_HIGH);// 禁用光栅RasterDisable(SOC_LCDC_0_REGS);// 时钟配置RasterClkConfig(SOC_LCDC_0_REGS, 28800000, LCD_CLK);// 配置 LCD DMA 控制器RasterDMAConfig(SOC_LCDC_0_REGS, RASTER_DOUBLE_FRAME_BUFFER,RASTER_BURST_SIZE_16, RASTER_FIFO_THRESHOLD_8,RASTER_BIG_ENDIAN_DISABLE);// 模式配置(例如:TFT 或者 STN,彩色或者黑白 等等)RasterModeConfig(SOC_LCDC_0_REGS, RASTER_DISPLAY_MODE_TFT,RASTER_PALETTE_DATA, RASTER_COLOR, RASTER_RIGHT_ALIGNED);// 帧缓存数据以 LSB 方式排列RasterLSBDataOrderSelect(SOC_LCDC_0_REGS);// 禁用 Nibble 模式RasterNibbleModeDisable(SOC_LCDC_0_REGS);// 配置光栅控制器极性RasterTiming2Configure(SOC_LCDC_0_REGS, RASTER_FRAME_CLOCK_LOW |RASTER_LINE_CLOCK_LOW|RASTER_PIXEL_CLOCK_LOW |RASTER_SYNC_EDGE_RISING|RASTER_SYNC_CTRL_ACTIVE|RASTER_AC_BIAS_HIGH, 0, 255);// 配置水平 / 垂直参数RasterHparamConfig(SOC_LCDC_0_REGS, 800, 63, 70, 70);RasterVparamConfig(SOC_LCDC_0_REGS, 480, 4, 1, 23);// 配置 FIFO DMA 延时RasterFIFODMADelayConfig(SOC_LCDC_0_REGS, (17647058/8823529));//修改优先级val = HWREG(0x01C14118);val &= 0x0fffffff;HWREG(0x01C14118) = val;}/****************************************************************************/
/**/
/*LCD中断服务函数*/
/**/
/****************************************************************************/
void LCDIsr(void)
{unsigned intstatus;IntEventClear(SYS_INT_LCDC_INT);status = RasterIntStatus(SOC_LCDC_0_REGS,RASTER_END_OF_FRAME0_INT_STAT |RASTER_END_OF_FRAME1_INT_STAT );status = RasterClearGetIntStatus(SOC_LCDC_0_REGS, status);if (status & RASTER_END_OF_FRAME0_INT_STAT){RasterDMAFBConfig(SOC_LCDC_0_REGS,(unsigned int)(g_pucBuffer+4),(unsigned int)(g_pucBuffer+4) + sizeof(g_pucBuffer) - 2 - 4,0);}if(status & RASTER_END_OF_FRAME1_INT_STAT){RasterDMAFBConfig(SOC_LCDC_0_REGS,(unsigned int)(g_pucBuffer+4),(unsigned int)(g_pucBuffer+4) + sizeof(g_pucBuffer) - 2 - 4,1);}
}

qioa chen:

回复 qioa chen:

当采样点数Tn设置为16384的时候,可以显示

当采样点数增加到32768的时候显示就开始出现卡顿。两次的采样率都是40960,改变采样率不会影响卡顿。

另外画图的程序是这样的

GrContextForegroundSet(&sContext, ClrBlack);//去掉上一次画的线for(i=0; i<800-1; i++){GrLineDraw(&sContext, i, display_buffer[OldDisBuf][i], i+1, display_buffer[OldDisBuf][i+1]);}//画上新采集的一帧数据GrContextForegroundSet(&sContext, ClrBlue);//sContext是一个传递某上下文的标识for(i=0; i<800-1; i++){GrLineDraw(&sContext, i, display_buffer[NewDisBuf][i], i+1, display_buffer[NewDisBuf][i+1]);//一次画两个点(x1,y1;x2,y2)}

逻辑里面写了10个左右的for(i=0;i<Tn;i++)这样的循环,还有二层嵌套循环。不知道是什么原因导致显示不出来图形。在做另一个项目,做频谱分析的时候,FFT的点数增大到4096的时候也会出现卡顿。这是内存分配的问题吗?若是,要怎样修改CMD文件。

Nancy Wang:

回复 qioa chen:

1、看一下map文件里面buffer定义在哪里,然后再去CMD文件里查一下内存分配是否有问题。
2、增大stack/heap空间看看
3、LCD上显示不出来,数据输出引脚上是有输出的吗?单步执行有没有问题?还是直接程序跑飞了。

qioa chen:

回复 Nancy Wang:

.buffer >  DDR2  我增大了stack和heap后,还是出现一样的卡顿现象,程序不会跑飞,因为我只是将采样点增大了一倍,就出现了卡顿现象,说明卡顿就是由于采样点数引起的

下面是我的.cmd文件

/****************************************************************************/
/**/
/*OMAPL138 及 DSP C6748 内存空间分配定义*/
/**/
/*2014年05月16日*/
/**/
/****************************************************************************/
-stack 0x00080000//定义栈的大小,如果太小,会导致LCD显示的时候字乱码
-heap0x00080000
MEMORY
{
#ifdef DSP_CORE
/****************************************************************************/
/**/
/*DSP 专有内存区域*/
/**/
/****************************************************************************/DSPL2ROMo = 0x00700000l = 0x00100000/* 1MBL2 DSP 本地 ROM (DSP ROM Bootloader) */DSPL2RAMo = 0x00800000l = 0x00040000/* 256kB L2 DSP 本地 RAM */DSPL1PRAMo = 0x00E00000l = 0x00008000/* 32kBL1 DSP 本地程序 RAM */DSPL1DRAMo = 0x00F00000l = 0x00008000/* 32kBL1 DSP 本地数据 RAM */
#endif/****************************************************************************/
/**/
/*公共内存区域*/
/**/
/****************************************************************************/SHDSPL2ROMo = 0x11700000l = 0x00100000/* 1MBL2 共享内置 ROM */SHDSPL2RAMo = 0x11800000l = 0x00040000/* 256KB L2 共享内置 RAM */SHDSPL1PRAMo = 0x11E00000l = 0x00008000/* 32KBL1 共享内置程序 RAM */SHDSPL1DRAMo = 0x11F00000l = 0x00008000/* 32KBL1 共享内置数据 RAM */EMIFACS0o = 0x40000000l = 0x20000000/* 512MB SDRAM (CS0) */EMIFACS2o = 0x60000000l = 0x02000000/* 32MB异步(CS2) */EMIFACS3o = 0x62000000l = 0x02000000/* 32MB异步(CS3) */EMIFACS4o = 0x64000000l = 0x02000000/* 32MB异步(CS4) */EMIFACS5o = 0x66000000l = 0x02000000/* 32MB异步(CS5) */SHRAMo = 0x80000000l = 0x00020000/* 128KB 共享 RAM */DDR2o = 0xC0001000l = 0x0F000000/* 128MBDDR2 分配给 DSP */EntryPointo = 0xC0000000l = 0x00000800/* 2 KBC 语言入口点 */Vectoro = 0xC0000800l = 0x00000800/* 2 KB中断向量表 *//****************************************************************************/
/**/
/*外设内存区域*/
/**/
/****************************************************************************/SYSCFG0o = 0x01C14000l = 0x00001000/* 4KSYSCFG0 */uPPo = 0x01E16000l = 0x00001000/* 4KuPP */GPIOo = 0x01E26000l = 0x00001000/* 4KGPIO */McBSP1o = 0x01D11000l = 0x00000800/* 2KMcBSP1 */#ifndef DSP_CORE
/****************************************************************************/
/**/
/*ARM 专有内存区域*/
/**/
/****************************************************************************/ARMROMo = 0xFFFD0000l = 0x00010000/* 64kBARM 本地 ROM (ARM ROM Bootloader) */ARMRAMo = 0xFFFF0000l = 0x00002000/* 8kBARM 本地 RAM */
#endif
}SECTIONS
{.text:_c_int00	>EntryPoint/* 可执行代码 C 程序入口点*/.text>DDR2/* 可执行代码 */.stack>DDR2/* 软件系统栈 */.bss>DDR2/* 未初始化全局及静态变量 */.cio>DDR2/* C 输入输出缓存 */".vectors">Vector/* 中断向量表 */.const>DDR2/* 常量 */.data>DDR2/* 已初始化全局及静态变量 */.switch>DDR2/* 跳转表 */.sysmem>DDR2/* 动态内存分配区域 */.far>DDR2/* 远程全局及静态变量 */.args>DDR2.ppinfo>DDR2.ppdata>DDR2/* TI-ABI 或 COFF */.pinit>DDR2/* C++ 结构表 */.cinit>DDR2/* 初始化表 *//* EABI */.binit>DDR2.init_array>DDR2.neardata>DDR2.fardata>DDR2.rodata>DDR2.c6xabi.exidx	>DDR2.c6xabi.extab	>DDR2/* DDR2 */.buffer>DDR2/* 外设*/.Reg_SYSCFG0	>SYSCFG0.Reg_uPP>uPP.Reg_GPIO>GPIO.Reg_McBSP1>McBSP1
}

Nancy Wang:

回复 qioa chen:

内存分配应该没问题,程序里调用的哪个里面的FFT程序,把具体的路径和工程贴出来看一下。

qioa chen:

回复 Nancy Wang:

这个工程里面没有用到FFT,之前说的是另一个项目里面有用到FFT,出现增大FFT点数变卡顿的现象。这个项目里面就是采集Tn个点后判断极值点,然后重构出原来物体振动信息。增大点数就变卡不是和内存有关系吗。我把真个工程加到附件里面。SMI_fringe_count.zip

赞(0)
未经允许不得转载:TI中文支持网 » 增大采样点数出现卡顿
分享到: 更多 (0)