1、堆栈溢出:以TI CCS3.3为例,程序运行的堆与栈的空间大小都是由软件设计师自己定义分配大小的。一般出现问题就是为DSP软件运行设置的堆或栈的空间太小,而导致程序不能正常运行。堆或栈空间太小编译生成out文件时,是不会报错的。TI ccs3.3中Stack Size是0x400(即默认的配置),Heap Size是0x200(即默认配置)。如果程序出现莫名的跑飞情况可以试试改改这两个参数值。
2、数组溢出:数组溢出就是定义数组的空间大小,而通过数组下表访问时,下标超过了数组的边界,这样可能改写其他地址的数据,造成程序跑飞。有可能是使用未初始化的变量作为下标方位数组(这种情况编译器通常会有warning提示);还有可能是通过计算关系计算下标,而在异常的情况下下标会越界(应用下标前对下标的范围进行判定,正常后再使用)。
3、访问指向空地址的指针:访问未初始化的空指针也可能出现DSP跑飞的情况;或者将指针作为函数参数传递时,指针未指向具体的地址,而在函数中使用,可能出现死机的情况(也可能不会,在ccs3.3下)。这些“指针未初始化”或“指针未指向具体变量”的问题编译器不会提示错误,最多提示警告。而“指针未指向具体变量”作为函数参数传递,在VC2005中,编译时不会报错,但有警告,但是在debug状态下运行时直接就跑死了,也算是暴露问题了。
4、未声明的函数调用跑飞:在TI ccs3.3中一些函数没有显式声明,而直接调用可能达不到函数预期的效果或者就是跑飞。以前写过一个CCS环境下因printf函数跑飞的问题。其实未声明函数调用,在zynq的开发平台vivado的SDK中也出现过,编译不报错,运行就是达不到预期的效果。
十有九是遇到无效地址了,你可以看一下停止的地方是不是NMI中断,或是其他什么地方。另外:
1.设置断点,看看程序是否有进入主程序,最好能看到停止前执行到那部分程序;
2.把管脚重新焊一遍,保证没有虚焊;
3.检查复位管脚的信号;
4.检查晶振信号;
5.自己想办法测试一下仿真器是否正常工作。
需要手动加入库文件:C:/CCStudio_v3.1/C6000/csl/lib/cslDM642.lib/*
* 功能:CSL中cache module和timer module的使用示例
* 说明: 需要手动加入库文件:C:/CCStudio_v3.1/C6000/csl/lib/cslDM642.lib,建议到TI网站下载最新的CSL库更新,否则有些模块可能会出问题
* 设计者: 3881
* 日期: 2010-5-28
*/
#include <csl.h> //顶层应用程序模块,用于初始化CSL。
main初始化部分,分三部分代码麻烦分析,main调用,BSP部分,GUI初始化部分
<div class="blockcode"><blockquote>int main(void)
{
/* STM32F4xx HAL library initialization:
- Configure the Flash prefetch, instruction and Data caches
- Configure the Systick to generate an interrupt each 1 msec
- Set NVIC Group Priority to 4
- Global MSP (MCU Support Package) initialization
*/
HAL_Init()
/* Configure the system clock to 180 MHz */
SystemClock_Config()
BSP_Config()
/* Configure LED1 and LED3 */
BSP_LED_Init(LED1)
BSP_LED_Init(LED3)
file_isok = FatFS_Init()
/* Thread 1 definition */
osThreadDef(LED1, LED_Thread1, osPriorityNormal, 0, configMINIMAL_STACK_SIZE)
/* Thread 2 definition */
osThreadDef(LED3, LED_Thread2, osPriorityNormal, 0, configMINIMAL_STACK_SIZE)
osThreadDef(GUI_TASKID, GUI_Thread, osPriorityNormal, 0, 2048)
/* Start thread 1 */
LEDThread1Handle = osThreadCreate (osThread(LED1), NULL)
/* Start thread 2 */
LEDThread2Handle = osThreadCreate (osThread(LED3), NULL)
GUIThreadHandle = osThreadCreate (osThread(GUI_TASKID), NULL)
//init_gui()
/* Start scheduler */
osKernelStart()
/* We should never get here as control is now taken by the scheduler */
for()
}
void BSP_Config(void)
{
/* Initializes the SDRAM device */
BSP_SDRAM_Init()
/* Initialize the Touch screen */
BSP_TS_Init(800, 480)
//BSP_TS_Init(320, 240)
/* Enable the CRC Module */
__HAL_RCC_CRC_CLK_ENABLE()
__HAL_RCC_BKPSRAM_CLK_ENABLE()
/* Compute the prescaler value to have TIM3 counter clock equal to 10 KHz */
uwPrescalerValue = (uint32_t) ((SystemCoreClock /2) / 10000) - 1
/* Set TIMx instance */
TimHandle.Instance = TIM3
/* Initialize TIM3 peripheral as follows:
+ Period = 500 - 1
+ Prescaler = ((SystemCoreClock/2)/10000) - 1
+ ClockDivision = 0
+ Counter direction = Up
*/
TimHandle.Init.Period = 500 - 1
TimHandle.Init.Prescaler = uwPrescalerValue
TimHandle.Init.ClockDivision = 0
TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP
if(HAL_TIM_Base_Init(&TimHandle) != HAL_OK)
{
while(1)
{
}
}
/*##-2- Start the TIM Base generation in interrupt mode ####################*/
/* Start Channel1 */
if(HAL_TIM_Base_Start_IT(&TimHandle) != HAL_OK)
{
while(1)
{
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)