OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4642|回复: 9

請教:儲存檔案超過2048個字節該如何處理?

[复制链接]

4

主题

11

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-3-16
在线时间
0 小时
发表于 2015-5-13 17:52:26 | 显示全部楼层 |阅读模式
5金钱
請教原子哥:
我使用SDIO 模式,想要儲存"戰艦開發板"串口接收的資料,
儲存2048個字節以內都沒問題,
儲存超過2048個字節就不行,
請問要如何處理?
謝謝!!!

(我是使用您的例程做修改:
//fname:文件名
//strx:要寫入的字符串
//repeat:寫入的次數(文件大小=strx長度*repeat次數)
void testwrite(u8 *fname,u8* strx,u32 repeat)
{
FIL* f_test;
u8 *databuf; //數組
u8 strxlen=strlen((const char*)strx); //字符串長度
u32 bufrpt=2048/strxlen; //databuf每次能存儲strx的條數
u32 rpcnt=0;
............)


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-13 22:50:26 | 显示全部楼层
你申请了足够多的内存么?
你给的这部分代码,没看出问题
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1815
金钱
1815
注册时间
2011-10-9
在线时间
230 小时
发表于 2015-5-14 13:41:59 | 显示全部楼层
buf[4096] 

u32 count=0;
串口中断
{
   
  buf[count]=res;
count++;

}


main
{
  while(1)
  {

   if count=2048{
               进行一次写入 sd也好 flash也好
                    }
   if count==4096
               {

                   再写一次
             count=0;

              }
 }



}
回复

使用道具 举报

4

主题

11

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-3-16
在线时间
0 小时
 楼主| 发表于 2015-5-15 11:15:14 | 显示全部楼层

回复【2楼】 正点原子 :   感謝回覆!!
---------------------------------
 回复【3楼】 simms01 :   感謝回覆!!
---------------------------------

我使用原子哥的例程(串口IAP實驗) 修改為 SD(SDIO Mode) IAP,已經可以由SD Card更新APP Firmware,
後來想增加串口接收Bin file再存入SD Card內,
修改後已可接收大約9K字節數  (#define USART_REC_LEN   9*1024 //定義最大接收字節數 9K)
超過9K則會顯示內存空間不足:  ..\OBJ\test.axf: Error: L6220E: Execution region RW_IRAM1 size (66048 bytes) exceeds limit (65536 bytes). ....
故而想使用外部SRAM儲存串口接收的數據,
修改為外部內存設定:
1)存檔函數緩衝修改:
......
 f_test=(FIL*)mymalloc(SRAMEX,sizeof(FIL)); //SRAMEX外部SRAM
 databuf=mymalloc(SRAMEX,strxlen); //SRAMEX外部SRAM
.......

2)usart.c 修改
.......
//u8 USART_RX_BUF[USART_REC_LEN] __attribute__ ((at(0X68000000)));//接收緩衝
........

3)malloc.c修改
.......
//內存池(4字節對齊)
__align(4) u8 mem1base[MEM1_MAX_SIZE]; //內部SRAM內存池
__align(4) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68020000))); //外部SRAM內存池 
//內存管理表
u16 mem1mapbase[MEM1_ALLOC_TABLE_SIZE]; //內部SRAM內存池MAP
u16 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((at(0X68020000+MEM2_MAX_SIZE))); //外部SRAM內存池MAP 
//內存管理參數    
......

可以接收打樣出串口數據(但數據末端會多出數十個不正確的字節),而且存檔後為0byte,無內容....
我不確定item 2 & 3 外部內存池設定是否正確!!
故要麻煩原子哥幫忙指點一下.....TKS!

IAP程式使用方法:
1)按住Key_up開機,進入IAP程式 , 若沒按住Key_up開機直接進入APP程式.
2)若0:\Bin\opel.bin有程式,則再按下Key_up則更新APP程式
3)可接收串口資料,目前先存於0:\opel.bin ,若日後測試可以接收大字節數(3~4萬個吧)的Bin file時再修改到0:\Bin\ ,
後續想修改為接收ATK-RM04 WIFI模塊 串口Data....

IAP Bootloader V1.0(SDIO)_RS232儲存.zip

3.93 MB, 下载次数: 26

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-15 23:23:09 | 显示全部楼层
回复【4楼】ouopel1234:
---------------------------------
 2,正确。
3,正确。

建议你把:USART_RX_BUF定义成指针。
然后,在使用之前,用malloc,申请外部内存,给USART_RX_BUF,就可以了,这样改动小。
而且控制方便。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

11

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-3-16
在线时间
0 小时
 楼主| 发表于 2015-5-17 18:20:56 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
謝謝原子哥的回覆.
分別調用
f_test=(FIL*)mymalloc(SRAMIN,sizeof(FIL)); //存檔調用內部SRAM
databuf=mymalloc(SRAMEX,strxlen); //串口資料調用外部SRAM
已可使用外部SRAM當作是串口接收緩衝.
但是目前發生二個問題:
1)我使用XCOM V2.0串口調試助手 發送494字節 存檔OK, 若發送544字節 存檔NG, 猜想應該大於512字節就會出錯了....不知何故?
2)使用XCOM V2.0串口調試助手,若發送檔案為494字節,會發現於外部SRAM接收後再輸出於串口會多出若干不明字節(亂碼),
   反覆發送同一檔案, USART_RX_CNT顯示接收字節數一樣, 但經過 外部SRAM緩衝後,接收的數據大小 strxlen=strlen((const char*)USART_RX_BUF) 會與USART_RX_CNT 不同,不知是何故?
希望各位能指點一 二....
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-17 23:11:35 | 显示全部楼层
回复【6楼】ouopel1234:
---------------------------------
这个现象不应该啊,你试试放内部sram看看正常不?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

11

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-3-16
在线时间
0 小时
 楼主| 发表于 2015-5-18 12:04:48 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
原子哥,我改為內部SRAM 一切都正常,只可惜只能接收9K而已(  #define USART_REC_LEN   9*1024)
我只有改動:
內部SRAM設定:
  u8 USART_RX_BUF[USART_REC_LEN] __attribute__ ((at(0X20001000)));
f_test=(FIL*)mymalloc(SRAMIN,sizeof(FIL));
databuf=mymalloc(SRAMIN,strxlen);



外部SRAM:
u8 USART_RX_BUF[USART_REC_LEN] __attribute__ ((at(0X68000000)))
f_test=(FIL*)mymalloc(SRAMEX,sizeof(FIL));
databuf=mymalloc(SRAMEX,strxlen);
回复

使用道具 举报

4

主题

11

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-3-16
在线时间
0 小时
 楼主| 发表于 2015-5-18 18:01:17 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
原子哥.
SRAM與TFT anel都是使用 FSMC ,
會是二者時序的問題,造成sram接收到TFT anel的資料而造成亂碼嗎?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-19 01:09:30 | 显示全部楼层
回复【9楼】ouopel1234:
---------------------------------
看看是不是外部sram速度影响。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 09:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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