DSP增大采样数据点数后,LCD显示出现卡顿,显示不出数据。请问在配置文件中怎么更改。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
项目是重构物体振动波形;采集到电信号后,对采集到的点做时域分析,判断出输入信号的极值点,然后根据极值点来恢复物体振动波形。
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_CLK 228000000
#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 int status;
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);
}
}
当采样点数增加到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文件。
.buffer > DDR2 我增大了stack和heap后,还是出现一样的卡顿现象,程序不会跑飞,因为我只是将采样点增大了一倍,就出现了卡顿现象,说明卡顿就是由于采样点数引起的
下面是我的.cmd文件
/****************************************************************************/
/* */
/* OMAPL138 及 DSP C6748 内存空间分配定义 */
/* */
/* 2014年05月16日 */
/* */
/****************************************************************************/
-stack 0x00080000 //定义栈的大小,如果太小,会导致LCD显示的时候字乱码
-heap 0x00080000
MEMORY
{
#ifdef DSP_CORE
/****************************************************************************/
/* */
/* DSP 专有内存区域 */
/* */
/****************************************************************************/
DSPL2ROM o = 0x00700000 l = 0x00100000 /* 1MB L2 DSP 本地 ROM (DSP ROM Bootloader) */
DSPL2RAM o = 0x00800000 l = 0x00040000 /* 256kB L2 DSP 本地 RAM */
DSPL1PRAM o = 0x00E00000 l = 0x00008000 /* 32kB L1 DSP 本地程序 RAM */
DSPL1DRAM o = 0x00F00000 l = 0x00008000 /* 32kB L1 DSP 本地数据 RAM */
#endif
/****************************************************************************/
/* */
/* 公共内存区域 */
/* */
/****************************************************************************/
SHDSPL2ROM o = 0x11700000 l = 0x00100000 /* 1MB L2 共享内置 ROM */
SHDSPL2RAM o = 0x11800000 l = 0x00040000 /* 256KB L2 共享内置 RAM */
SHDSPL1PRAM o = 0x11E00000 l = 0x00008000 /* 32KB L1 共享内置程序 RAM */
SHDSPL1DRAM o = 0x11F00000 l = 0x00008000 /* 32KB L1 共享内置数据 RAM */
EMIFACS0 o = 0x40000000 l = 0x20000000 /* 512MB SDRAM (CS0) */
EMIFACS2 o = 0x60000000 l = 0x02000000 /* 32MB 异步 (CS2) */
EMIFACS3 o = 0x62000000 l = 0x02000000 /* 32MB 异步 (CS3) */
EMIFACS4 o = 0x64000000 l = 0x02000000 /* 32MB 异步 (CS4) */
EMIFACS5 o = 0x66000000 l = 0x02000000 /* 32MB 异步 (CS5) */
SHRAM o = 0x80000000 l = 0x00020000 /* 128KB 共享 RAM */
DDR2 o = 0xC0001000 l = 0x0F000000 /* 128MB DDR2 分配给 DSP */
EntryPoint o = 0xC0000000 l = 0x00000800 /* 2 KB C 语言入口点 */
Vector o = 0xC0000800 l = 0x00000800 /* 2 KB 中断向量表 */
/****************************************************************************/
/* */
/* 外设内存区域 */
/* */
/****************************************************************************/
SYSCFG0 o = 0x01C14000 l = 0x00001000 /* 4K SYSCFG0 */
uPP o = 0x01E16000 l = 0x00001000 /* 4K uPP */
GPIO o = 0x01E26000 l = 0x00001000 /* 4K GPIO */
McBSP1 o = 0x01D11000 l = 0x00000800 /* 2K McBSP1 */
#ifndef DSP_CORE
/****************************************************************************/
/* */
/* ARM 专有内存区域 */
/* */
/****************************************************************************/
ARMROM o = 0xFFFD0000 l = 0x00010000 /* 64kB ARM 本地 ROM (ARM ROM Bootloader) */
ARMRAM o = 0xFFFF0000 l = 0x00002000 /* 8kB ARM 本地 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
}
这个工程里面没有用到FFT,之前说的是另一个项目里面有用到FFT,出现增大FFT点数变卡顿的现象。这个项目里面就是采集Tn个点后判断极值点,然后重构出原来物体振动信息。增大点数就变卡不是和内存有关系吗。我把真个工程加到附件里面。3683.SMI_fringe_count.zip