7815

帖子

56

TA的资源

裸片初长成(中级)

41
 
cruelfox 发表于 2015-6-16 10:17
struct UserData * userdata =(struct UserData *)0xB0001000;  /* 内存首址 */

直接操作,比如
  user ...

不过你既然是用指针,你这只是给指针赋值,可是指针指向的空间却没有分配空间,直接操作是不行的。
还少了一步分配空间。
此帖出自编程基础论坛
个人签名

强者为尊,弱者,死无葬身之地

 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

42
 
247153481 发表于 2015-6-16 12:30
我觉得首先应该在段定义文件中定义一个存储段,不然都是白搭。
比如代码段 数据段 usedata 存储段 。。。 ...

今天我在PC上试着写的时候。
也发现了这个问题。
PC的存储器分配和我当时那个片子不一样。
我始终没猜到那一片空间可以让我不分配,直接操作。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

43
 
shinykongcn 发表于 2015-6-17 10:16
迟到了,群消息看了点,不小心看到st库的提示,就直接找网址,到了这个帖子,然后自己写了个,草率问题多多 ...

我仔细看了这段代码。
你前面的封装方法是对的,当然这其实也是ST库里干的那一套。

虽然,在PC上,我现在也没找到一个具体的可以任意操作地址的空间——所以如果我要写出一个和你们一样可以运行的程序,似乎目前我能想到的办法也只是 类似你们用的 malloc
但要注意的一点是,如果你用malloc,实际上,分配到的地址并非你指定的。

当然,这一点是在我想这个问题的时候,没有考虑到的。
所以,我只是想看看你们怎么封装这个数据而已,你们都做到了。

当然,还有一个小瑕疵,我为什么会想到用结构体呢?
那是因为我不想自己做一点点的 偏移运算。
所以,我的方法和你们的方法唯一区别,我最后又用了一个大的结构体封装了一个数组,这个动作看起来多余,但却可以让我不用计算任何偏移量。

稍后,看最后一个贴,我贴我的代码上来你们就知道了。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

44
 
深蓝恋风 发表于 2015-6-17 11:30
下面是文字代码,各位看官可亲自验证一手!  

#include
#include

/*存储起始地址定义*/
#define  ...

这个犯的错太明显了。
因为数组,根本不可能让你自己指定地址。
就算这个存储器上能找到这么一个区域——比如我当时用的那个片子,它上面那个区域的地址就允许我随意操作的。
在那样一个存储器上你这个写法仍然不对。
不过,鉴于你也写了代码,挺不容易的,所以,我给你一半,1000个芯币。

当然楼上那哥们,我给够2000个。
虽然他需要自己计算偏移量——和我的方式差了一点。
但谁能说我的方法就是最好的呢?

只不过,我省去了自己计算偏移量,方便。
他那个方法虽然要计算,但因为是宏,所以最后每次操作可以直接从每个用户的基地址上开始操作,在速度上比我的方案有一些优势。

当然,我个人认为这是可以取舍的。
并不存在优劣之分,就看你在乎什么?我在乎它“全自动偏移”,不用我人为任何干涉这很爽。
而你也当然可以在乎它速度快,操作直接
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

45
 
  1. #define MAX_USER_ACCOUNTS   4

  2. typedef struct
  3. {
  4.         char x_flag;
  5.         int account;
  6.         short test_flag;
  7.         short date;
  8.         double rate;
  9.         char rec[20];
  10.         double last[11];
  11. }User;

  12. // 这里,为什么我要用一个结构体包含这个数组,而不直接定义数组呢?
  13. // 答案很简单:数组的内存分配不由我控制,我无法指定其地址;
  14. // 而用结构体.......看下边 行 A-1
  15. typedef struct
  16. {
  17.         User user[MAX_USER_ACCOUNTS];
  18. }UsersBase; //这个名字不要太在意,我起这个名字,意在它是我取所有用户数据的起始点

  19. // 接下来就是这个解决方案最关键的地方,每个地方都有注释说明
  20. #define UserData ((UsersBase *)0xC13d1000)//行 A-1,此处假设我的指定存储地址起始为 0x00001000

  21. //接下来的操作,只是为了让这个宏的调用变得简单些,最后你会发现,它和你期待看到的 数组中括号只差了一个 小括号

  22. #define Custom(x) (UserData->user[x])

  23. int main()
  24. {
  25.         char p;
  26.         char *d;
  27.         printf("%p",&p);
  28.         d = (char *)malloc(3);
  29.         if(d != NULL)
  30.                 printf("d locate %p",d);
  31.         //好了,简单写个操作;//当然,我这是在电脑上,我没办法让它成为一个真正的 掉电存储区;

  32.        // Custom(1).account = 1;
  33.         //Custom(1).last[5] = 0.43;

  34.         printf("show out \n account %d\t last %f\n",Custom(1).account,Custom(1).last[5]);

  35.         return 0;
  36. }
复制代码
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

46
 
楠哥,帮个忙,再帮我散一下芯币

shinykongch  2000个芯币
深恋蓝风       1000个芯币
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

954

帖子

0

TA的资源

纯净的硅(初级)

47
 
辛昕 发表于 2015-7-2 23:06
今天我在PC上试着写的时候。
也发现了这个问题。
PC的存储器分配和我当时那个片子不一样。
我始终没猜 ...

pc的话,有硬盘嘛,我一直觉得要做到你说的那样好像就一个方法,绝对地址。
不过pc上,其实Linux已经给出了答案,内核里面我记得有很详细的说明如何做
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

48
 
247153481 发表于 2015-7-2 23:45
pc的话,有硬盘嘛,我一直觉得要做到你说的那样好像就一个方法,绝对地址。
不过pc上,其实Linux已经给出 ...

其实这个本来也不是啥复杂的题目。
我只是想看看你们会怎么玩内存定位。

只不过我自己也没想到PC上和那个MCU不一样,这是马前失蹄
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

9185

帖子

6

TA的资源

管理员

49
 
辛昕 发表于 2015-7-2 23:17
楠哥,帮个忙,再帮我散一下芯币

shinykongch  2000个芯币
深恋蓝风       1000个芯币

已转
此帖出自编程基础论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
 
 

回复

954

帖子

0

TA的资源

纯净的硅(初级)

50
 
辛昕 发表于 2015-7-3 00:11
其实这个本来也不是啥复杂的题目。
我只是想看看你们会怎么玩内存定位。

只不过我自己也没想到PC上和 ...

这应该主要因为虚拟内存的存在吧?使得每个进程都占有N GB的空间,一旦进程退出,内存也随之释放了(算是操作系统的基本功能?)
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

51
 
247153481 发表于 2015-7-3 09:05
这应该主要因为虚拟内存的存在吧?使得每个进程都占有N GB的空间,一旦进程退出,内存也随之释放了(算是 ...

可能吧,具体没研究。
再说
不过本身这个话题并不关心具体的内存读写细节。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

8

帖子

2

TA的资源

一粒金砂(初级)

52
 
挂号
此帖出自编程基础论坛
 
 
 

回复

1976

帖子

0

TA的资源

五彩晶圆(初级)

53
 
通读全文,获益菲浅,之前在用51只知道可以51编译器可以使用_at_ 关键字来固定flash存储地址,这两天要在M0的片子上要存储用户配置数据,思路一直不清晰,只想着要试着用#define userdata_adr  0x0001f000这样的方式来先用着,一时没想到使用指针的方式(之前在用51时试过直接定时一个常量,然后取地址进行操作,结果编译时提示错误),现在看来指针就能很好地解决这种问题了,都怪自己没有对m0这样的MCU的头文件进行仔细研究,不然早该想到的,总之是学到了个实用的技巧
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

54
 
bobde163 发表于 2016-9-10 23:08
通读全文,获益菲浅,之前在用51只知道可以51编译器可以使用_at_ 关键字来固定flash存储地址,这两天要在M0 ...

这么久的老帖子,仍然能回复,很感谢。
同时,也对这个不值一提的小问题,能对你有帮助,很高兴!

你现在遇到的问题。
和楼主贴里,我曾经遇到这个问题的时候的情形几乎一摸一样。
我当时也没有想到stm32库可以借鉴。

自己折腾了一两个晚上,和网上的人讨论来讨论去才最后想到这个办法。

此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

1976

帖子

0

TA的资源

五彩晶圆(初级)

55
 
辛昕 发表于 2016-9-12 01:17
这么久的老帖子,仍然能回复,很感谢。
同时,也对这个不值一提的小问题,能对你有帮助,很高兴!

你 ...

谢谢版主的回复,看到帖子里各位坛友各抒自见,能学到很多东西
此帖出自编程基础论坛
 
 
 

回复

994

帖子

3

TA的资源

一粒金砂(高级)

56
 
茅塞顿开的感觉
此帖出自编程基础论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表