OpenEdv-开源电子网

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

FATFS一个小BUG搞了我2天才解决.特此发帖,希望大家不要重蹈我的覆辙.

  [复制链接]

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2012-8-9 16:25:43 | 显示全部楼层 |阅读模式
问题:在做豪华版fatfs实验的时候,发现从综合实验移植过来的fatfs部分,f_mkdir不能正常工作,跟踪调试发现死在move_window函数里面,如下图红线处.


只要执行过红线,就进入hard_fault了...
经验告诉我,这肯定是内存访问有问题.
于是对比成功和失败两个版本的fs,wsect,fs->fatbase,fs->fsize 他们对应值都一样!!!
这样,哥迷茫了...
于是使出浑身解数,疯狂替换反替换,结果还是一样...
后来发现我的综合实验使用了-o1,等优化选项.于是设置为一模一样.此时终于可以f_mkdir了...
但是作为普通实验,没必要开优化啊...所以还得找原因.
没办法,最后用绝招了,从最简单的做起,把不相干的代码统统砍掉.最后在去掉malloc的时候,奇迹终于出现了...
把如下代码:
//为exfuns申请内存
//返回值:0,成功
//1,失败
u8 exfuns_init(void)
{
 fs[0]=(FATFS*)mymalloc(SRAMIN,sizeof(FATFS)); //为磁盘0工作区申请内存 
 fs[1]=(FATFS*)mymalloc(SRAMIN,sizeof(FATFS)); //为磁盘1工作区申请内存
 file=(FIL*)mymalloc(SRAMIN,sizeof(FIL));  //为file申请内存
 ftemp=(FIL*)mymalloc(SRAMIN,sizeof(FIL));  //为ftemp申请内存
 fatbuf=(u8*)mymalloc(SRAMIN,512);    //为fatbuf申请内存
 if(fs[0]&&fs[1]&&file&&ftemp&&fatbuf)return 0;  //申请有一个失败,即失败.
 else return 1; 
}
不用malloc,而直接用全局数组来实现,就可以正常工作.
然后发现FATFS本来只有562字节,但是sizeof之后,却是564字节,反复数了N遍,确认FATFS只有562字节,这多了的2个字节,肯定就是FATFS结构体数据对其的问题了,于是赶紧在FATFS结构体前面加上__paked关键字.如下:
__packed typedef struct {
 BYTE fs_type;  /* FAT sub-type (0:Not mounted) */
 BYTE drv;   /* Physical drive number */
 BYTE csize;   /* Sectors per cluster (1,2,4...128) */
 BYTE n_fats;   /* Number of FAT copies (1,2) */
 BYTE wflag;   /* win[] dirty flag (1:must be written back) */
 BYTE fsi_flag;  /* fsinfo dirty flag (1:must be written back) */
 WORD id;    /* File system mount ID */
 WORD n_rootdir;  /* Number of root directory entries (FAT12/16) */
#if _MAX_SS != 512
 WORD ssize;   /* Bytes per sector (512, 1024, 2048 or 4096) */
#endif
#if _FS_REENTRANT
 _SYNC_t sobj;   /* Identifier of sync object */
#endif
#if !_FS_READONLY
 DWORD last_clust;  /* Last allocated cluster */
 DWORD free_clust;  /* Number of free clusters */
 DWORD fsi_sector;  /* fsinfo sector (FAT32) */
#endif
#if _FS_RPATH
 DWORD cdir;   /* Current directory start cluster (0:root) */
#endif
 DWORD n_fatent;  /* Number of FAT entries (= number of clusters + 2) */
 DWORD fsize;   /* Sectors per FAT */
 DWORD fatbase;  /* FAT start sector */
 DWORD dirbase;  /* Root directory start sector (FAT32:Cluster#) */
 DWORD database;  /* Data start sector */
 DWORD winsect;  /* Current sector appearing in the win[] */
 BYTE win[_MAX_SS]; /* Disk access window for Directory, FAT (and Data on tiny cfg) */
} FATFS;

之后再用sizeof,得到FATFS大小是562字节了...
然后再次加入malloc,代码也可以正常工作了.
至此,该问题终于解决了.
究其原因,就是FATFS结构体的字节对齐问题.所以建议大家在自己建立结构体的时候,最好加上__packed关键字,免得再出现这种郁闷的情况.
浪费2天...
不过也有所收获.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2195
金钱
2195
注册时间
2012-2-8
在线时间
34 小时
发表于 2012-8-9 18:12:02 | 显示全部楼层
建议直接修改 malloc 使之分配出来的内存字节对齐,而不是修改 FATFS 源码,
如果强制用 pack 指令,最直接的影响就是程序的性能降低,虽然会节省 ram,但是省不了 flash
就算没有用 pack 指令,性能也可能会降低,而且如果运气不好,就会进入一些奇怪的错误中断了
修改 malloc 可以提高程序的兼容性。在 32 位机上通常是 4 字节对齐的。
https://github.com/roxma
回复 支持 2 反对 1

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
 楼主| 发表于 2012-8-10 00:09:48 | 显示全部楼层
回复【13楼】Pony279:
---------------------------------
是的,这里确实是我哪个malloc的问题.
在内存池前加上4字节对齐,问题解决!

//内存池(4字节对齐)
__align(4) u8 mem1base[MEM1_MAX_SIZE]; //内部SRAM内存池
__align(4) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000))); //外部SRAM内存池
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 2 反对 0

使用道具 举报

27

主题

274

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
471
金钱
471
注册时间
2011-11-2
在线时间
11 小时
发表于 2012-8-9 16:54:26 | 显示全部楼层
忽然让我想到了SSD的4K对齐,学习了。
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
 楼主| 发表于 2012-8-9 17:14:12 | 显示全部楼层
接着调试,发现FIL也需要字节对齐才行,否则也有问题!!!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2195
金钱
2195
注册时间
2012-2-8
在线时间
34 小时
发表于 2012-8-9 18:21:21 | 显示全部楼层
在 programming manual 中有提到对齐问题,
通常编译器在生成代码的时候都会进行结构体填充,保证最高性能的对齐方式,
编译器自动分配出来结构体的内存肯定是对齐的,但是对于 malloc 分配出来的不对齐的内存,编译器是不知道的,所以很可能会产生问题。



https://github.com/roxma
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
 楼主| 发表于 2012-8-9 18:22:35 | 显示全部楼层
回复【4楼】Pony279:
---------------------------------
但是sizeof都不正确(实际562个字节,但是sizeof后是564个字节,不知道它怎么对齐的,横竖都不应该是564的...),你malloc后怎么正确的指向?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2195
金钱
2195
注册时间
2012-2-8
在线时间
34 小时
发表于 2012-8-9 18:26:01 | 显示全部楼层
sizeof “不正确”是结构体填充,是为了保证内部的成员对齐
就像
struct A{
u16 m1;
u32 m2;
};
的结果是 sizeof(A) == 8 而不是 6
https://github.com/roxma
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2195
金钱
2195
注册时间
2012-2-8
在线时间
34 小时
发表于 2012-8-9 18:26:48 | 显示全部楼层
只要保证 malloc 分配出来的首地址是 4 字节对齐就行了。
https://github.com/roxma
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2195
金钱
2195
注册时间
2012-2-8
在线时间
34 小时
发表于 2012-8-9 18:39:47 | 显示全部楼层
关于 sizeof  和 结构体的问题网上也有很多讨论,这里有三个链接
http://blog.csdn.net/liuhuiyi/article/details/7538864
http://www.codeproject.com/Articles/48810/Structure-Padding
http://bytes.com/topic/c/answers/543879-what-structure-padding
https://github.com/roxma
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
 楼主| 发表于 2012-8-9 21:59:40 | 显示全部楼层
用align修饰数组后,可以去掉packed关键字了.

ARM下的对齐处理 
from DUI0067D_ADS1_2_CompLib

3.13 type  qulifiers

有部分摘自ARM编译器文档对齐部分

对齐的使用:
1.__align(num)
   这个用于修改最高级别对象的字节边界。在汇编中使用LDRD或者STRD时
   就要用到此命令__align(8)进行修饰限制。来保证数据对象是相应对齐。
   这个修饰对象的命令最大是8个字节限制,可以让2字节的对象进行4字节
   对齐,但是不能让4字节的对象2字节对齐。
   __align是存储类修改,他只修饰最高级类型对象不能用于结构或者函数对象。
   
2.__packed 
  __packed是进行一字节对齐
  1.不能对packed的对象进行对齐
  2.所有对象的读写访问都进行非对齐访问
  3.float及包含float的结构联合及未用__packed的对象将不能字节对齐
  4.__packed对局部整形变量无影响
  5.强制由unpacked对象向packed对象转化是未定义,整形指针可以合法定
  义为packed。
     __packed int* p;  //__packed int 则没有意义
  6.对齐或非对齐读写访问带来问题
  __packed struct STRUCT_TEST
{
  char a;
  int b;
  char c;
}  ;    //定义如下结构此时b的起始地址一定是不对齐的
         //在栈中访问b可能有问题,因为栈上数据肯定是对齐访问[from CL]
//将下面变量定义成全局静态不在栈上 
static char* p;
static struct STRUCT_TEST a;
void Main()
{
__packed int* q;  //此时定义成__packed来修饰当前q指向为非对齐的数据地址下面的访问则可以

p = (char*)&a;          
q = (int*)(p+1);      

*q = 0x87654321; 
/*   
得到赋值的汇编指令很清楚
ldr      r5,0x20001590 ; = #0x12345678
[0xe1a00005]   mov      r0,r5
[0xeb0000b0]   bl       __rt_uwrite4  //在此处调用一个写4byte的操作函数 
      
[0xe5c10000]   strb     r0,[r1,#0]   //函数进行4次strb操作然后返回保证了数据正确的访问
[0xe1a02420]   mov      r2,r0,lsr #8
[0xe5c12001]   strb     r2,[r1,#1]
[0xe1a02820]   mov      r2,r0,lsr #16
[0xe5c12002]   strb     r2,[r1,#2]
[0xe1a02c20]   mov      r2,r0,lsr #24
[0xe5c12003]   strb     r2,[r1,#3]
[0xe1a0f00e]   mov      pc,r14
*/

/*
如果q没有加__packed修饰则汇编出来指令是这样直接会导致奇地址处访问失败
[0xe59f2018]   ldr      r2,0x20001594 ; = #0x87654321
[0xe5812000]   str      r2,[r1,#0]
*/

//这样可以很清楚的看到非对齐访问是如何产生错误的
//以及如何消除非对齐访问带来问题
//也可以看到非对齐访问和对齐访问的指令差异导致效率问题
}
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

432

帖子

0

精华

高级会员

Rank: 4

积分
729
金钱
729
注册时间
2012-6-21
在线时间
59 小时
发表于 2012-8-9 23:17:36 | 显示全部楼层
mark.....
回复 支持 反对

使用道具 举报

12

主题

216

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2011-4-7
在线时间
3 小时
发表于 2012-8-9 23:49:21 | 显示全部楼层
收下!!
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2195
金钱
2195
注册时间
2012-2-8
在线时间
34 小时
发表于 2012-8-9 23:52:16 | 显示全部楼层
原子哥,其实我并不认为这个问题要归为fatfs的bug,

因为它的定义和操作并没有不符合C语言本身语的法标准的地方

"不用malloc,而直接用全局数组来实现,就可以正常工作."

从这一点也可以看出,如果原子哥把在那一点调用 malloc 分配出来的地址打印出来,结果是不会被4整除的,

作为标准库函数之一的malloc的实现者,本应考虑到这些处理器的兼容性的问题,而不应该把问题交给使用者去处理,

否则,以后每次使用 malloc 分配结构体,都得使用这些奇怪的对齐指令才能保证不会出问题。
https://github.com/roxma
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2195
金钱
2195
注册时间
2012-2-8
在线时间
34 小时
发表于 2012-8-10 00:02:48 | 显示全部楼层
看了下C++标准,在标准中对 malloc 这一类的 allocation function 也是有说明的,


https://github.com/roxma
回复 支持 反对

使用道具 举报

48

主题

376

帖子

0

精华

高级会员

Rank: 4

积分
621
金钱
621
注册时间
2011-3-18
在线时间
7 小时
发表于 2012-8-11 11:08:44 | 显示全部楼层
回复【14楼】Pony279:
---------------------------------
你好呀,我也時常看你的回復,發現你把C語運用得好深入
回复 支持 反对

使用道具 举报

48

主题

376

帖子

0

精华

高级会员

Rank: 4

积分
621
金钱
621
注册时间
2011-3-18
在线时间
7 小时
发表于 2012-8-11 11:11:03 | 显示全部楼层
回复【15楼】正点原子:
---------------------------------
想原子哥真的用好多時間去做好這板,用心等待,支持
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
 楼主| 发表于 2012-8-11 12:24:08 | 显示全部楼层
谢谢
回复 支持 反对

使用道具 举报

57

主题

431

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
880
金钱
880
注册时间
2011-12-25
在线时间
11 小时
发表于 2012-8-30 21:54:19 | 显示全部楼层
回复【14楼】Pony279:
---------------------------------
每次看到你回复,感觉都是天书一下,,我何时才能够看懂啊。。
很喜爱电子行业
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2012-11-11
在线时间
1 小时
发表于 2012-11-14 09:44:55 | 显示全部楼层
mark下...
回复 支持 反对

使用道具 举报

46

主题

329

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1544
金钱
1544
注册时间
2012-4-9
在线时间
80 小时
发表于 2012-11-14 13:04:20 | 显示全部楼层
mark!
回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2233
金钱
2233
注册时间
2012-4-30
在线时间
7 小时
发表于 2012-11-14 13:12:36 | 显示全部楼层
真心感觉Pony279大哥C运用的好深。太牛逼了。好奇是个什么人物~~
回复 支持 反对

使用道具 举报

10

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2013-4-24
在线时间
4 小时
发表于 2013-5-9 13:04:29 | 显示全部楼层
回复【5楼】Pony279:
--------------------------------
对齐问题是如何产生的呢?有何影响吗?如何避免?请高手解答下。
牛逼死了,牛还活着吗?
回复 支持 反对

使用道具 举报

96

主题

762

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1228
金钱
1228
注册时间
2012-10-19
在线时间
15 小时
发表于 2013-5-9 13:58:20 | 显示全部楼层
回复【13楼】Pony279:
---------------------------------
关于内存一块 理解的好深,难道C++上非常重视这点?
回复 支持 反对

使用道具 举报

头像被屏蔽

52

主题

440

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1237
金钱
1237
注册时间
2013-1-9
在线时间
151 小时
发表于 2013-5-9 14:51:15 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2195
金钱
2195
注册时间
2012-2-8
在线时间
34 小时
发表于 2013-5-9 19:38:55 | 显示全部楼层
回复【24楼】tian123chi:
---------------------------------
对齐问题,搜索一下就可以了解了,其实C语言本身是很难解释这个问题的,有兴趣可以翻一下汇编指令集相关文档(比如cortex m3的官方文档,或者STM32F10xxx Cortex-M3 programming manual)里面对 alignment 的说明,C语言都是要被编译器翻译成汇编的。
https://github.com/roxma
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2013-5-9 20:11:39 | 显示全部楼层
这要是我两年也搞不定
回复 支持 反对

使用道具 举报

50

主题

201

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2013-4-9
在线时间
1 小时
发表于 2013-6-26 18:48:58 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
发表于 2013-6-27 09:37:45 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
原子哥正解,由于fatfs出现HardFault,我也不是第一次遇到了,早在mini板的PDA发布之前,调试fatfs就遇到过好几次,可当时解决方法就一味的把FIL等东西弄全局变量,因为一旦弄函数里就HardFault,经原子哥解说,顿时觉悟,获益匪浅~
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
发表于 2013-6-27 09:40:08 | 显示全部楼层
回复【楼主位】正点原子:
---------------------------------
果然是FATFS结构体导致的,我之前也一直怀疑这个东西,这东西一旦放函数里就死掉,最后我唯一解决方法就整个工程,一个磁盘建立一个FATFS全局变量了事。
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
发表于 2013-6-27 09:42:09 | 显示全部楼层
回复【15楼】正点原子:
---------------------------------
加了这个,弄动态的就不好弄了,我试过启动了内存池之后,如果再外部定义一些东西,很容易出现RAM容量不足而报错,又有可能因为我把内存定义太大了。
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2013-7-5
在线时间
0 小时
发表于 2013-7-5 14:17:56 | 显示全部楼层
MARK下,这种问题非常难查
回复 支持 反对

使用道具 举报

25

主题

683

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1350
金钱
1350
注册时间
2012-4-25
在线时间
195 小时
发表于 2013-7-5 15:32:45 | 显示全部楼层
这种问题一般出现在使用OS 时候 ,不用OS 是不会有这样问题出现的,如果用了OS,在任务栈内数组 最好加关键字 8字节对齐
1-1
回复 支持 反对

使用道具 举报

2

主题

1436

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2209
金钱
2209
注册时间
2010-12-16
在线时间
190 小时
发表于 2013-7-8 02:23:51 | 显示全部楼层
查阅帮助文档的malloc部分,mdk的malloc申请的内存区时8字节对齐的.

查阅帮助文档的align部分,mdk的对齐策略如pony所述.

综上,可能原子自己实现的malloc没有实现4字节或以上的对齐.本人没有查阅原子的代码.

本人很多项目都只开-Otime优化,没有开其他优化,使用多任务,cpp下new内存空间,没有发现类似错误..
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

头像被屏蔽

6168

主题

7036

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
19705
金钱
19705
注册时间
2012-12-27
在线时间
25 小时
发表于 2013-7-8 13:01:12 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

2

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2011-3-10
在线时间
4 小时
发表于 2013-7-21 10:02:47 | 显示全部楼层
我线目地仰望你们,,我何时能够听懂你们的谈话呢???汗,,,我个菜鸟,,,
回复 支持 反对

使用道具 举报

3

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2012-10-28
在线时间
18 小时
发表于 2013-10-17 14:23:40 | 显示全部楼层
正在看MALLOC章节实验,强烈mark
聚集产生财富,见识决定命运。
回复 支持 反对

使用道具 举报

5

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-9-16
在线时间
8 小时
发表于 2013-10-23 15:57:09 | 显示全部楼层
好深入好深入 mark  这帖子汇集了众大神啊
回复 支持 反对

使用道具 举报

15

主题

204

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
287
金钱
287
注册时间
2013-7-17
在线时间
0 小时
发表于 2013-10-24 11:47:18 | 显示全部楼层
回复【19楼】冰是睡着的水:
---------------------------------
我看你的回帖也会感觉天书。。。。。。感觉你们都好厉害。。。。。
有生之年,只诉温暖不言殇,花味渐浓,茶味渐醇,倾心相遇,安暖相陪。
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2013-3-20
在线时间
0 小时
发表于 2013-11-16 20:42:38 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

0

主题

17

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2014-3-18
在线时间
0 小时
发表于 2014-3-18 10:38:59 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

13

主题

123

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-8-3
在线时间
0 小时
发表于 2014-9-7 01:30:16 | 显示全部楼层
学习了,今晚遇到了类似的情况
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2012-5-10
在线时间
0 小时
发表于 2014-11-4 09:23:05 | 显示全部楼层
马克
回复 支持 反对

使用道具 举报

5

主题

91

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2014-10-28
在线时间
14 小时
发表于 2014-11-4 11:00:59 | 显示全部楼层
回复【4楼】Pony279:
---------------------------------
malloc分配的内存不是也是对齐的么,32位一般8字节对齐
成功必然有成功的原因,
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2195
金钱
2195
注册时间
2012-2-8
在线时间
34 小时
发表于 2014-11-5 19:33:26 | 显示全部楼层
回复【45楼】simplelifeNick:
---------------------------------
原子哥的 maloc 是自己写的
https://github.com/roxma
回复 支持 反对

使用道具 举报

5

主题

91

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2014-10-28
在线时间
14 小时
发表于 2014-11-5 21:13:56 | 显示全部楼层
回复【46楼】Pony279:
---------------------------------
仔细看了也发现了是mymalloc,我跑ucos-iii,他有内存池,应该不会问题吧 哈哈
不过话说如果不考虑内存碎片
用标准的malloc应该不会出现这样的问题吧 ,因为及时struct有对齐,我不会去手算字节 而是用的sizeof,它已经算入了对齐的填补字节
所以只有来说不会有问题吧?
成功必然有成功的原因,
回复 支持 反对

使用道具 举报

7

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2014-11-24
在线时间
3 小时
发表于 2014-12-1 16:10:19 | 显示全部楼层
MARK一下,迟早会用到的。
回复 支持 反对

使用道具 举报

32

主题

153

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
453
金钱
453
注册时间
2014-11-5
在线时间
0 小时
发表于 2015-2-22 11:21:11 | 显示全部楼层
回复【46楼】Pony279:
---------------------------------
都是些大大神的啊,看的像天书一样
酱油团队--
回复 支持 反对

使用道具 举报

0

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2015-1-16
在线时间
4 小时
发表于 2015-4-14 13:58:32 | 显示全部楼层
MARK一下
回复 支持 反对

使用道具 举报

4

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2013-12-3
在线时间
0 小时
发表于 2015-4-29 11:53:08 | 显示全部楼层
这个帖子写的真的很好,我也在在OS上用f_mkdir上面出了问题,一直解决不了,焕然大悟啊,谢谢原子哥。
帮助别人就是帮助自己!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 01:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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