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