搜索
bottom↓
回复: 13

测试TK499在0x20000000地址的内存大小,得到16K 可用空间

[复制链接]

出0入0汤圆

发表于 2021-2-23 15:51:52 | 显示全部楼层 |阅读模式
测试代码
        TestSRAM((INT32U*)(T_SRAM_BASE+0x800),0x100);
前0x800 地址是 中断向量表


void TestSRAM(INT32U *pSrc,INT32U len)
{
        INT32U i,*pTest=pSrc;
        for(i=0;i<len;i++)
        {
                *pTest=i;
                printf("addr=%X 测试:%X\r\n",(INT32U)pTest,*pTest);
                pTest+=0x10;
        }
        pTest=pSrc;
        for(i=0;i<len;i++)
        {
                printf("addr=%X 测试:%X\r\n",(INT32U)pTest,*pTest);
                pTest+=0x10;
        }
}

得到 0x20000000~0x20004000 里面的数据是可读写的,
所以隐藏了 16K 的ram 在系统中

出20入186汤圆

发表于 2021-2-23 16:10:34 | 显示全部楼层
是不是本来就有?手册中有介绍这个地址么?

出0入0汤圆

 楼主| 发表于 2021-2-23 16:29:31 | 显示全部楼层
手册上面 没有看到吧

出0入0汤圆

发表于 2021-2-23 17:30:37 | 显示全部楼层
对结果感兴趣,版主确认一下??

出0入0汤圆

发表于 2021-2-24 08:40:28 来自手机 | 显示全部楼层
楼主可以做一次全部内存的遍历。比如从1自加,内存全写完再比较。

出215入118汤圆

发表于 2021-2-24 09:04:14 | 显示全部楼层
LinuxHacker 发表于 2021-2-24 08:40
楼主可以做一次全部内存的遍历。比如从1自加,内存全写完再比较。

是的,要看是不是访问的同一个内存区域。

出0入0汤圆

 楼主| 发表于 2021-2-24 10:52:09 | 显示全部楼层
LinuxHacker 发表于 2021-2-24 08:40
楼主可以做一次全部内存的遍历。比如从1自加,内存全写完再比较。

打算使用这片区域 用作 ucos任务的堆栈区域,
感觉这片内存的操作速度 会比 0x70000000 的速度快上不少,如果程序能正常跑 就这么 这片区域 没有问题了

出0入0汤圆

 楼主| 发表于 2021-2-24 11:58:49 | 显示全部楼层
本帖最后由 QbJacky 于 2021-2-24 12:45 编辑

同样一段贴图的代码,我将任务堆栈的内存放在 这个16K 里面 比放在8M 的堆栈 速度 快了  3/20  
原来要20ms 运行完的代码 换了堆栈区间后 只要 17ms


不过跑了 几秒钟 后就死机了

出0入0汤圆

 楼主| 发表于 2021-2-24 11:59:14 | 显示全部楼层
本帖最后由 QbJacky 于 2021-2-24 12:45 编辑

跑了几秒钟后死机了 找不出原因

出0入42汤圆

发表于 2021-2-24 13:09:44 | 显示全部楼层
本帖最后由 jimmy_xt 于 2021-2-24 13:18 编辑
  1. void  RemapVtorTable(void)
  2. {
  3.         int i;
  4.     RCC->AHB1ENR |= 1<<13;//bkp clk,enable sram
  5.         //¹ØROMÇøÖжÏ
  6.     for(i = 0;i<90;i++)
  7.     {
  8.         NVIC_DisableIRQ((IRQn_Type)i);
  9.     }
  10.         SCB->VTOR = 0;
  11.         SCB->VTOR |= 0x1<<29;
  12.         for(i = 0;i < 512;i+=4)
  13.         *(u32*)(T_SRAM_BASE + i) = *(u32*)(T_SDRAM_BASE+i);

  14. }
复制代码


按照sys.c里面的代码,把前2K让出来再试试,虽然理论上CM4的中断向量表只有1K大小。

  1. /******************  Bit definition for RCC_AHB1ENR register  ******************/
  2. #define  RCC_AHB1ENR_IOPAEN                  ((uint32_t)0x00000001)            /*!< IO port A clock enable */
  3. #define  RCC_AHB1ENR_IOPBEN                  ((uint32_t)0x00000002)            /*!< IO port B clock enable */
  4. #define  RCC_AHB1ENR_IOPCEN                  ((uint32_t)0x00000004)            /*!< IO port C clock enable */
  5. #define  RCC_AHB1ENR_IOPDEN                  ((uint32_t)0x00000008)            /*!< IO port D clock enable */
  6. #define  RCC_AHB1ENR_IOPEEN                  ((uint32_t)0x00000010)            /*!< IO port E clock enable */
  7. #define  RCC_AHB1ENR_CRCEN                   ((uint32_t)0x00001000)            /*!< CRC clock enable */
  8. #define  RCC_AHB1ENR_BKPSRAMEN               ((uint32_t)0x00002000)            /*!< BKPSRAM clock enable */
  9. #define  RCC_AHB1ENR_DMA1EN                  ((uint32_t)0x00200000)            /*!< DMA1 clock enable */
  10. #define  RCC_AHB1ENR_DMA2EN                  ((uint32_t)0x00400000)            /*!< DMA2 clock enable */
  11. #define  RCC_AHB1ENR_LCDEN                   ((uint32_t)0x80000000)            /*!< LCD-TFT clock enable */
复制代码

另外,按照参考手册,这部分RAM的时钟enable寄存器的名字叫做“RCC_AHB1ENR_BKPSRAMEN”。

个人瞎猜,TK499本来设计有SRAM,然后有问题弃用了。BKP里这个小sram拿来给延迟敏感的变量来用了。

再另,sys.c里还有这种代码
  1. //±¸Óú¯Êý
  2. //#define T_SRAM_FUN1 0x20000400
  3. //copyAtoB((u32)LCD_PutPixel&0xFFFFFFFE,T_SRAM_FUN1,800);//¼ÓÔغ¯Êýµ½SRAM
  4. //void copyAtoB(u32 srcAdd,u32 dstAdd,u16 len)
  5. //{
  6. //    len = (len + 3)/4;
  7. //    while(len--)
  8. //    {
  9. //        *(u32*)dstAdd = *(u32*)srcAdd;
  10. //        dstAdd += 4 ;
  11. //        srcAdd +=4 ;
  12. //    }
  13. //}
复制代码

所以,内部应该也测试过,把程序拷贝进SRAM跑。另外这个offset0x20000400,似乎只用让开1K?

出0入0汤圆

 楼主| 发表于 2021-2-24 13:33:48 | 显示全部楼层
jimmy_xt 发表于 2021-2-24 13:09
按照sys.c里面的代码,把前2K让出来再试试,虽然理论上CM4的中断向量表只有1K大小。

在 main 里面 TestSRAM((INT8U*)0x20000800,0x3800/4,0);  写入
在 ucos 里面 TestSRAM((INT8U*)0x20000800,0x3800/4,1);  比较
发现写入和 读出 都 ok
但是 使用 它作为 堆栈 就 跑 4-10 是 就崩溃了
我测试 前16K 写入 读出 都 没有问题的


  1. void TestSRAM(INT8U *pSrc,INT32U len,INT8U mode)
  2. {
  3.         INT32U i,errcnt=0;
  4.         INT32U *pTest=(INT32U*)pSrc;
  5.         if(mode==0)
  6.         {
  7.                 for(i=0;i<len;i++)
  8.                 {
  9.                         *pTest++=(INT32U)pTest;
  10.                 }
  11.         }
  12.         else
  13.         {
  14.                 for(i=0;i<len;i++)
  15.                 {
  16.                         if(*pTest!=(INT32U)pTest)
  17.                         {
  18.                                 printf("error=%X 测试:%X\r\n",*pTest,(INT32U)pTest);
  19.                                 ++errcnt;
  20.                         }
  21.                         pTest++;
  22.                 }
  23.                 printf("错误:%d %d\r\n",errcnt,len);
  24.         }
  25. }
复制代码

出0入93汤圆

发表于 2021-2-24 15:12:37 | 显示全部楼层
QbJacky 发表于 2021-2-24 11:59
跑了几秒钟后死机了 找不出原因

是不是这部分SRAM是Cache哦,用来加速SDRAM的

出0入0汤圆

 楼主| 发表于 2021-2-24 15:37:53 | 显示全部楼层
takashiki 发表于 2021-2-24 15:12
是不是这部分SRAM是Cache哦,用来加速SDRAM的

不是吧,我写入数据 =程序运行一段时间 监控 都没有变化

出0入0汤圆

发表于 2021-3-5 21:54:12 来自手机 | 显示全部楼层
要注意一个地址掩码问题。 像spi nor你怎么写, 读同样的地址都是是对的, 地址有掩码
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 05:36

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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