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.

增大采样点数出现卡顿

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

  • 请再详细描述一下您的项目的具体细节以及LCD的配置部分。
  • 项目是重构物体振动波形;采集到电信号后,对采集到的点做时域分析,判断出输入信号的极值点,然后根据极值点来恢复物体振动波形。

    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);
        }
    }
    
    

  • 当采样点数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文件。

  • 1、看一下map文件里面buffer定义在哪里,然后再去CMD文件里查一下内存分配是否有问题。
    2、增大stack/heap空间看看
    3、LCD上显示不出来,数据输出引脚上是有输出的吗?单步执行有没有问题?还是直接程序跑飞了。
  • .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,出现增大FFT点数变卡顿的现象。这个项目里面就是采集Tn个点后判断极值点,然后重构出原来物体振动信息。增大点数就变卡不是和内存有关系吗。我把真个工程加到附件里面。3683.SMI_fringe_count.zip