OpenEdv-开源电子网

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

我把ucgui+fatfs添加到一起,在mian中运行正常,但是一到 子函数中就不对了,直接就错误中断了。改了堆栈还是不对

[复制链接]

115

主题

548

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2100
金钱
2100
注册时间
2013-11-27
在线时间
518 小时
发表于 2015-2-18 17:50:44 | 显示全部楼层 |阅读模式
5金钱
void GUI_X_GetFontData(char* font, U32 oft, U8 *ptr, U8 bytes)
{
FATFS fs;                // ????????
FIL *fsrc;                                              // ?¨????????×÷?à 
FRESULT res;                                            // ?¨????×÷?á??±??? 
UINT br;              // ?¨??????????±??? 
f_mount(0, &fs); // ????????????
res = f_open(fsrc, font, FA_OPEN_EXISTING | FA_READ);   //?ò??×???????  
if(res != FR_OK)  
{  
//?ò???§°?????????           
}            
res = f_lseek(fsrc,oft);                            //?????×???· 
res = f_read(fsrc, ptr, bytes, &br);                //????32??×??????ó????
res = f_close(fsrc);                                //??±?×???
     f_mount(0, 0);                                     //????????????
}
每次到打开 文件就出问题

最佳答案

查看完整内容[请看2#楼]

回复【4楼】ofourme: --------------------------------- FIL *fsrc;  这个地方不能用*。 但是不知道为什么。 外置字库 移植成功。 但是有个疑惑啊 我看到 那个 帖子里面给的字库 8*16的 ascii码的字库 怎么是4096啊?? 8*16的ascii不是应该是 128*16吗?应该是2048啊,怎么会多一倍???剩下的是什么内容嗯?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

115

主题

548

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2100
金钱
2100
注册时间
2013-11-27
在线时间
518 小时
 楼主| 发表于 2015-2-18 17:50:45 | 显示全部楼层
回复【4楼】ofourme:
---------------------------------
FIL *fsrc; 
这个地方不能用*。
但是不知道为什么。
外置字库 移植成功。

但是有个疑惑啊

我看到 那个 帖子里面给的字库 8*16的 ascii码的字库 怎么是4096啊??
8*16的ascii不是应该是 128*16吗?应该是2048啊,怎么会多一倍???剩下的是什么内容嗯?
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2015-2-18 23:48:11 | 显示全部楼层
FATFS 占用的内存比较大,子程序的栈空间不够。建议改成全局变量。
业余程序玩家。
回复

使用道具 举报

115

主题

548

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2100
金钱
2100
注册时间
2013-11-27
在线时间
518 小时
 楼主| 发表于 2015-2-19 20:50:38 | 显示全部楼层
回复【2楼】ofourme:
---------------------------------
我找原因了 不是内存大 原因
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2015-2-19 23:28:53 | 显示全部楼层
回复【3楼】wmh19910511:
---------------------------------
那是什么原因?不给大家分享一下经验?
业余程序玩家。
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2015-2-20 08:31:10 | 显示全部楼层
fsrc估计还得给他初始化吧。因为需要空间保存字库的路径啊。
2048或是4096就看你的需要了啊,你可以用后面的空间扩展字符。或者你可以吧后面的打印出来看看效果啊。
业余程序玩家。
回复

使用道具 举报

1

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2012-11-8
在线时间
44 小时
发表于 2015-2-23 11:42:13 | 显示全部楼层
回复【5楼】wmh19910511:
---------------------------------
FIL *fsrc;
这里keil编译器没有给你这个指针分配地址(fsrc 值为null),就是说你的程序要初始化这个空指针,需要程序分配地址。但是标准库里面的malloc()函数也不行,可以用原子哥写的内存分配函数。
回复

使用道具 举报

115

主题

548

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2100
金钱
2100
注册时间
2013-11-27
在线时间
518 小时
 楼主| 发表于 2015-2-25 04:14:11 | 显示全部楼层
回复【7楼】shimengdacs:
---------------------------------
怪不得,我看到论坛里面就是用的分配内存就是可以,可是我的程序里面没有。所以就是不行。

你的意思是说 如果在这里要用指针的话,就需要给指针指向的地址赋值吗?


那为什么 我在其他的地方用指针就可以直接用吗?
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13135
金钱
13135
注册时间
2012-11-26
在线时间
3814 小时
发表于 2015-2-25 09:15:54 | 显示全部楼层
回复【8楼】wmh19910511:
---------------------------------
那是因为你别的地方的内存已经分配过了吧
学无止境
回复

使用道具 举报

1

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2012-11-8
在线时间
44 小时
发表于 2015-2-25 20:27:16 | 显示全部楼层
回复【8楼】wmh19910511:
---------------------------------
不是给指针指向的地址赋值,而是给指针赋值,就是初始化指针。

char * p;   //定义一个char型指针p
*p = ‘a’;   //给指针指向的地址赋值,这时你不知道p指向哪里,程序可能报错
p = 0x20000000; //初始化p,这时p才可以使用

未经初始化的指针是野指针,不能用的,指针是c语言的核心,楼主可以去搜下空指针和野指针等相关概念。
就标准c程序而言,可以使用 FIL *fsrc = malloc(sizeof(FIL));  的方式来初始化,但是我不清楚为什么keil的编译器malloc()函数不能用。
原子哥的内存分配的实质是声明一个数组,为数组分配有效首地址keil是可以做到的,然后通过分配数组里面的元素来确保分配出去的内存是有效的。
回复

使用道具 举报

115

主题

548

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2100
金钱
2100
注册时间
2013-11-27
在线时间
518 小时
 楼主| 发表于 2015-2-26 08:42:15 | 显示全部楼层
回复【10楼】shimengdacs:
---------------------------------
是啊,我说的指针的地址不就是p吗?

char * p;   //定义一个char型指针p 
*p = ‘a’;   //给指针指向的地址赋值,这时你不知道p指向哪里,程序可能报错 
p = 0x20000000; //初始化p,这时p才可以使用 


是不是 只需要第一句话和第三句话,就可以了 是吧?
回复

使用道具 举报

1

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2012-11-8
在线时间
44 小时
发表于 2015-2-26 11:39:03 | 显示全部楼层
回复【11楼】wmh19910511:
---------------------------------
对  是的
回复

使用道具 举报

115

主题

548

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2100
金钱
2100
注册时间
2013-11-27
在线时间
518 小时
 楼主| 发表于 2015-2-26 15:09:07 | 显示全部楼层
回复【12楼】shimengdacs:
---------------------------------
不对啊,我先挂载文件系统,这个时候没出错,是在打开的时候出错误的列。
挂载的时候还不是用到了文件指针,为什么这个时候没出错呢?
回复

使用道具 举报

115

主题

548

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2100
金钱
2100
注册时间
2013-11-27
在线时间
518 小时
 楼主| 发表于 2015-2-26 15:15:53 | 显示全部楼层
回复【12楼】shimengdacs:
---------------------------------
哦哦  是我看错了 我知道了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-25 19:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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