硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2398|回复: 18
收起左侧

[μCOS-III] 请教下,为何使用ucos 系统后,初始化 内存管理,优化等级设置为3(keil)会出现硬件错误 ?

[复制链接]

610

主题

3062

回帖

4912

积分

至尊会员

积分
4912
发表于 2020-4-1 15:46:16 | 显示全部楼层 |阅读模式
请教下,为何使用ucos 系统后,初始化 内存管理,优化等级设置为3(keil)会出现硬件错误 ?


通用的内存管理,如果使用 ucOS-Ii/III 的话,优化等级设置为 0 就没有问题,

同样的内存管理程序,如果使用 FreeRTOS 系统,优化等级设置为最高也是没有任何问题的,

那么使用 uCOS 系统会出现这个硬件错误 是怎么一回事啊 ????????????
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
发表于 2020-4-1 15:59:51 | 显示全部楼层
使用我二代示波器里面的uCOS-III内存管理试试,为了方便各个内存块管理和类似malloc的随意使用方式专门搞了个。
默认例子是开的最高等级优化3

【二代示波器】事隔三年后开启二代示波器的设计工作,性能将更强劲,向专业示波器设计靠拢,已经发布
http://www.armbbs.cn/forum.php?m ... id=45785&fromuid=58
(出处: 硬汉嵌入式论坛)

回复

使用道具 举报

610

主题

3062

回帖

4912

积分

至尊会员

积分
4912
 楼主| 发表于 2020-4-1 16:20:07 | 显示全部楼层
eric2013 发表于 2020-4-1 15:59
使用我二代示波器里面的uCOS-III内存管理试试,为了方便各个内存块管理和类似malloc的随意使用方式专门搞了 ...

好的,多谢多谢啊
回复

使用道具 举报

610

主题

3062

回帖

4912

积分

至尊会员

积分
4912
 楼主| 发表于 2020-4-1 19:08:49 | 显示全部楼层
本帖最后由 hpdell 于 2020-4-1 20:17 编辑
eric2013 发表于 2020-4-1 15:59
使用我二代示波器里面的uCOS-III内存管理试试,为了方便各个内存块管理和类似malloc的随意使用方式专门搞了 ...

刚刚试过了,貌似还是一样的会出现 HardFault_Handler ... ...?
我重新封装为

//内存池类型定义
typedef enum
{
AXISRAM        =     0,         //内部内存池
SRAM1                ,           //内部内存池
// SRAM4                ,                 //内部内存池
SDRAMEX                    //外部内存池(SDRAM)
} MEMORY_DefType;


// D1域, AXI SRAM, 512KB, 地址 0x2400 0000
#define AXISRAM_RT_ADDR   (uint32_t)(0x24000000)
#define AXISRAM_RT_MAX_SIZE          512*1024    // 单片机内部 AXI SRAM 最大管理 512KByte 的空间

// D2域, 128KB SRAM1(0x30000000) + 128KB SRAM2(0x30020000)
#define SRAM1_RT_ADDR   (uint32_t)(0x30000000)
#define SRAM1_RT_MAX_SIZE          256*1024    // 单片机内部 AXI SRAM 最大管理 256KByte 的空间

// D2域  32KB SRAM3(0x30040000) 这个空间不用管理,预留给 eth 网络使用

//// D3域, 64KB SRAM4(0x38000000)
//#define SRAM4_RT_ADDR   (uint32_t)(0x38000000)
//#define SRAM4_RT_MAX_SIZE          64*1024    // 单片机内部 AXI SRAM 最大管理 256KByte 的空间

//SDRAM         
#define SDRAM_RT_ADDR                     (SDRAM_MALLOC_BASE_USER_ADDR)
#define SDRAM_RT_MAX_SIZE            (uint32_t)(SDRAM_MALLOC_MAX_SIZE)        




/* Types */
typedef struct mem {              /* << Memory Pool management struct >>     */
  struct mem *next;               /* Next Memory Block in the list           */
  U32         len;                /* Length of data block                    */
} MEMP;



void my_mem_init(MEMORY_DefType memx)
{
  if(memx == AXISRAM)
  {
    rt_init_mem((void *)AXISRAM_RT_ADDR, AXISRAM_RT_MAX_SIZE);
  } else if(memx == SRAM1)
  {
    rt_init_mem((void *)SRAM1_RT_ADDR, SRAM1_RT_MAX_SIZE);
  } else if(memx == SDRAMEX)
  {
    rt_init_mem((void *)SDRAM_RT_ADDR, SDRAM_RT_MAX_SIZE);
  }

}



// =========================================================================================================
// 以下为外部调用函数
/*
内存初始化
*/
void bsp_MemoryInit(void)
{
         my_mem_init(AXISRAM);                  //初始化内部内存池
        my_mem_init(SRAM1);                    //初始化内部内存池
  my_mem_init(SDRAMEX);                  //初始化外部SDRAM内存池

}




/*
内存申请
*/
void *mymalloc(MEMORY_DefType memx,uint32_t size)
{
  void * MallocAddr = NULL;

                if(AXISRAM == memx)
                {
                        MallocAddr =  rt_alloc_mem ((void *)AXISRAM_RT_ADDR,  size);
                }
                else if(SRAM1 == memx)
                {
                        MallocAddr =  rt_alloc_mem ((void *)SRAM1_RT_ADDR,  size);
                }

                else if(SDRAMEX == memx)
                {
                        MallocAddr =  rt_alloc_mem ((void *)SDRAM_RT_ADDR,  size);
                }
  return MallocAddr;
}

/*
内存释放
*/
void myfree(MEMORY_DefType memx,void *ptr)
{

                if(AXISRAM == memx)
                {
                        rt_free_mem  ((void *)AXISRAM_RT_ADDR, ptr);
                }
                else if(SRAM1 == memx)
                {
                        rt_free_mem  ((void *)SRAM1_RT_ADDR, ptr);
                }
                else if(SDRAMEX == memx)
                {
                        rt_free_mem  ((void *)SDRAM_RT_ADDR, ptr);
                }
}


优化设置为 0: 优化0-24000000.png

优化0-30000000.png


优化0-D0C00000.png


==============================================

优化设置为 3
优化3-24000000.png

优化3-30000000.png


优化3-D0C00000.png


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
发表于 2020-4-2 00:58:33 | 显示全部楼层
hpdell 发表于 2020-4-1 19:08
刚刚试过了,貌似还是一样的会出现 HardFault_Handler ... ...?
我重新封装为

看下调试状态,进入硬件异常后,Hardfault Reports提示什么
回复

使用道具 举报

5

主题

201

回帖

216

积分

高级会员

积分
216
发表于 2020-4-2 09:59:20 | 显示全部楼层
如果是必进hard_fault的话,可以用一下这个CmBacktrace,这个是网友分享的cotex-mx的故障定位的代码。
你百度或者github了解下就好。它可以帮你准确的分析哪一行代码导致了这个问题。
回复

使用道具 举报

610

主题

3062

回帖

4912

积分

至尊会员

积分
4912
 楼主| 发表于 2020-4-2 10:00:41 | 显示全部楼层
eric2013 发表于 2020-4-2 00:58
看下调试状态,进入硬件异常后,Hardfault Reports提示什么

我自己只是在硬件错误中断里面提示了一下,没有具体的什么的内容

后续有空我吧错误诊断的函数加上去
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
发表于 2020-4-2 10:33:50 | 显示全部楼层
hpdell 发表于 2020-4-2 10:00
我自己只是在硬件错误中断里面提示了一下,没有具体的什么的内容

后续有空我吧错误诊断的函数加上去

Hardfault Reports是个调试组件,你进入调试状态后,打开下就行。
回复

使用道具 举报

610

主题

3062

回帖

4912

积分

至尊会员

积分
4912
 楼主| 发表于 2020-4-2 11:31:38 | 显示全部楼层
honami520 发表于 2020-4-2 09:59
如果是必进hard_fault的话,可以用一下这个CmBacktrace,这个是网友分享的cotex-mx的故障定位的代码。
你 ...

你说的是这个里面的内容吧 ?  https://github.com/armink/CmBacktrace
回复

使用道具 举报

610

主题

3062

回帖

4912

积分

至尊会员

积分
4912
 楼主| 发表于 2020-4-2 11:33:09 | 显示全部楼层
eric2013 发表于 2020-4-2 10:33
Hardfault Reports是个调试组件,你进入调试状态后,打开下就行。

你说的 Hardfault Reports 这个是 keil 自带的吗 ? 还是需要单独下载后再加载到程序里面的 ?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
发表于 2020-4-2 14:46:34 | 显示全部楼层
hpdell 发表于 2020-4-2 11:33
你说的 Hardfault Reports 这个是 keil 自带的吗 ? 还是需要单独下载后再加载到程序里面的 ?

QQ截图20200402144632.png
回复

使用道具 举报

610

主题

3062

回帖

4912

积分

至尊会员

积分
4912
 楼主| 发表于 2020-4-2 23:01:50 | 显示全部楼层



优化登记设置为1-3任一时, 查看信息
刚开始运行时:
37.png

当出现 Enter HardFault_Handler, System Halt. 这个错误后, 按下停止后出现如下:
38.png
这说明是哪个地方有问题呀 ???


// ---------------------------------------------------
优化登记设置为 0:
39.png
此时程序运行正常


回复

使用道具 举报

15

主题

117

回帖

162

积分

初级会员

积分
162
发表于 2020-4-3 08:55:57 | 显示全部楼层
使用朱总的CmBacktrace吧,很好用,而且很简单
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
发表于 2020-4-3 09:07:01 | 显示全部楼层
hpdell 发表于 2020-4-2 23:01
优化登记设置为1-3任一时, 查看信息
刚开始运行时:

impreciserr 大概率是内存越界访问了。
回复

使用道具 举报

610

主题

3062

回帖

4912

积分

至尊会员

积分
4912
 楼主| 发表于 2020-4-3 10:07:29 | 显示全部楼层
eric2013 发表于 2020-4-3 09:07
impreciserr 大概率是内存越界访问了。

那怎么 优化等级设置为 0 就没有什么问题呀 ?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
发表于 2020-4-3 10:08:36 | 显示全部楼层
hpdell 发表于 2020-4-3 10:07
那怎么 优化等级设置为 0 就没有什么问题呀 ?

说明程序代码不耐优化。
回复

使用道具 举报

610

主题

3062

回帖

4912

积分

至尊会员

积分
4912
 楼主| 发表于 2020-4-3 10:24:02 | 显示全部楼层
eric2013 发表于 2020-4-3 10:08
说明程序代码不耐优化。

那这个问题貌似插起来就有点麻烦了啊 ???

那现在主要是从哪方面着手啊 ? 有什么好的 建议 ??
回复

使用道具 举报

6

主题

641

回帖

659

积分

金牌会员

积分
659
QQ
发表于 2020-4-3 12:22:59 | 显示全部楼层
把你的用户应用代码删除了测试是否正常,还是多检查自己的用户应用程序
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 05:16 , Processed in 0.355780 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表