看公司的代码(LINUX的)里面有[__attribute__((section(".dabdata")))]这样的东西,我就想改一下原子的mymalloc代码。之前是这样处理的[__attribute__((section(".ARM.__at_0xc0000000")))],不知道是不是因为我用的ARMCC6.10的问题,下载是会提示没有对应FLASH算法。
第一阶段:
写好分散加载文件,编译下载运行进Hardfault。调试发现没进main()就死机了,在Fault Report里面看到IMPRECISERR打√了,不精确的数据访问。
百度一下,发现SDRAM必须在main()前初始化好。
第二阶段:
在SystemInit()函数插入SDRAM初始化,编译下载运行,还是死机。
/* system startup
*/
system_ClockConfig();
#if 1//defined(ExtSDRAM_ENABLE)
ExtSDRAM_Init();
#endif //ExtSDRAM_ENABLE
调试发现[__weak void HAL_SDRAM_MspInit(SDRAM_HandleTypeDef *hsdram)]这个函数似乎没有执行。
然后用[static void SDRAM_IOInit(void)]替代这个函数,编译下载运行OK没问题。
第三阶段:
上uCOS-II系统,编译下载,偶尔死机,按RESET键几次死机后就只能重新上电才能运行,或者下载完后就必须重新上电才能运行。
调试发现,死机后。
static void SDRAM_IOInit(void);
static void SDRAM_MPUInit(void);
uint8_t ExtSDRAM_Init(void)
{
uint32_t temp = 0;
uint8_t ret = 0;
/* SDRAM IO&Clock Enable */
SDRAM_IOInit();
DelayUs(20);
/* SDRAM FMC MPU Enable */
SDRAM_MPUInit();
DelayUs(20);
/* SDRAM init sequence
*/
.........
}
红色的两个函数并没有执行,重新上电后是好的。
然后把static去掉,编译下载运行完全没问题,无论是下载完运行,还是狂按RESET按键重启。但是在没有uCOS-II的时候是没问题,没搞懂这个。
现在malloc这部分是这么写的:
*********
/************* ARMCC Link *****************/
#define _SRAM12_RW __attribute__((section(".SRAM12")))
#define _SRAM4_RW __attribute__((section(".SRAM4")))
#define _ITCM_RW __attribute__((section(".ITCM")))
#define _DTCM_RW __attribute__((section(".DTCM")))
#ifdef ExtSDRAM_ENABLE
#define _EXTSDRAM_RW __attribute__((section(".ExtSDRAM")))
#endif //ExtSDRAM_ENABLE
********
__ALIGNED(4) uint8_t AXISRAM_BASE[AXISRAM_MALLOC_SIZE]; //default system SRAM
uint32_t AXISRAM_MAP[AXISRAM_MAPTAB_SIZE];
__ALIGNED(4) uint8_t AHBSRAM12_BASE[AHBSRAM12_MALLOC_SIZE] _SRAM12_RW;
uint32_t AHBSRAM12_MAP[AHBSRAM12_MAPTAB_SIZE] _SRAM12_RW;
__ALIGNED(4) uint8_t AHBSRAM4_BASE[AHBSRAM4_MALLOC_SIZE] _SRAM4_RW;
uint32_t AHBSRAM4_MAP[AHBSRAM4_MAPTAB_SIZE] _SRAM4_RW;
__ALIGNED(4) uint8_t DTCM_BASE[DTCM_MALLOC_SIZE] _DTCM_RW;
uint32_t DTCM_MAP[DTCM_MAPTAB_SIZE] _DTCM_RW;
__ALIGNED(4) uint8_t ITCM_BASE[ITCM_MALLOC_SIZE] _ITCM_RW;
uint32_t ITCM_MAP[ITCM_MAPTAB_SIZE] _ITCM_RW;
#if defined(ExtSDRAM_ENABLE)
__ALIGNED(4) uint8_t SDRAM_BASE[SDRAM_MALLOC_SIZE] _EXTSDRAM_RW;
uint32_t SDRAM_MAP[SDRAM_MAPTAB_SIZE] _EXTSDRAM_RW;
//__ALIGNED(4) uint8_t SDRAM_BASE[SDRAM_MALLOC_SIZE] __attribute__((section(".ARM.__at_0xc0000000")));
// uint32_t SDRAM_MAP[SDRAM_MAPTAB_SIZE] __attribute__((section(".ARM.__at_0xc1900000")));
#endif //ExtSDRAM_ENABLE
本人只在STM32F103上写过一些uCOS-II和FATFS的一些代码,本来就没啥经验。这个问题从上上个月开始就一直困扰着我,本来打算直接用指针算了,没那么多破事,但是想想还是解决算了。
就断断续续的,一边调其他代码一边处理这个问题。
有什么不对的,请轻喷,毕竟经验能力有限。 |