13257|55

7815

帖子

57

TA的资源

裸片初长成(中级)

楼主
 

纯C语法题:固定存储位置寻址定位 [复制链接]

 
题目很简单:


假设一个系统有 1到4个用户;

每个用户都有一部分数据需要掉电保持。它们(假设暂时有)

char x_flag;

int account;

short test_flag;

short date;

double rate;

char rec[20];

double last[11];




而 可掉电存储的存储区域地址固定,为 (如 0xB0001000 到 0xB0008000),根据你们的编译器和系统环境自己定,起始位置大小都无所谓,爱多少来多少。



要求:只使用标准C语法实现 对这些变量的 读写;



什么样的方法都不限制。

同时,我并不是要看到你们折腾出一个最好的方法,我最想看到的是你们在折腾的过程里 都折腾过什么方法。



方法不管好坏,只要你写的详细准确,有足够的简要说明。一定要可以实现,可以编译,可以运行起来;

我就给你2000芯币。

如果只是一个思路,但没法跑起来,但有超过2个人以上觉得很有意思,我就给800芯币;



一人一个思路(最先提出的得到)


此帖出自编程基础论坛

最新回复

茅塞顿开的感觉  详情 回复 发表于 2016-9-13 09:28
点赞 关注(1)
个人签名

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

 

回复
举报

6040

帖子

196

TA的资源

版主

沙发
 
我来占个沙发,我说下我的思路先:
首先定义一个结构体用来存放需要的数据:
struct Data{
    char x_flag;
    int account;
    short test_flag;
    short date;
    double rate;
    char rec[20];
    double last[11];
};
定义一个指针并初始化:
struct Data *const pData = 0xB0001000;
有四个用户,定义4个ID:
#define USER1 0
#define USER2 1
#define USER3 2
#define USER4 3
每个人有自己的数据变量
struct Data my_data;
根据用户ID获取自己的数据
memcpy(&my_data, &pData[USER1], sizeof(my_data));
保存数据:
memcpy(&pData[USER1], &my_data, sizeof(my_data));
当然要保证掉电存储区域不能被编译器用作其他用途,要告诉编译器这些地址要保留。
此帖出自编程基础论坛
 
 
 

回复

578

帖子

0

TA的资源

纯净的硅(初级)

板凳
 
前排占座学习,我也想想我的办法
此帖出自编程基础论坛
 
个人签名刻苦学习,共同进步
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

4
 
lcofjp 发表于 2015-6-15 18:40
我来占个沙发,我说下我的思路先:
首先定义一个结构体用来存放需要的数据:
struct Data{
    char x_flag;
    int account;
    short test_flag;
    short date;
    double rate;
    char rec[20];
    double last[11];
};
定义一个指针并初始化:
struct Data *const pData = 0xB0001000;
有四个用户,定义4个ID:
#define USER1 0
#define USER2 1
#define USER3 2
#define USER4 3
每个人有自己的数据变量
struct Data my_data;
根据用户ID获取自己的数据
memcpy(&my_data, &pData, sizeof(my_data));
保存数据:
memcpy(&pData, &my_data, sizeof(my_data));
当然要保证掉电存储区域不能被编译器用作其他用途,要告诉编译器这些地址要保留。

定位的方法很漂亮。
但是对它的存取还可以改进。

不管如何,800个币你是拿定了,就等你写出来
——其实也没多长,估计200行代码不够就可以了。
此帖出自编程基础论坛
 
个人签名

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

 
 

回复

7608

帖子

2

TA的资源

五彩晶圆(高级)

5
 
这是要做什么?
此帖出自编程基础论坛
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

6040

帖子

196

TA的资源

版主

6
 
辛昕 发表于 2015-6-15 20:02
定位的方法很漂亮。
但是对它的存取还可以改进。

不管如何,800个币你是拿定了,就等你写出来
——其实也没多长,估计200行代码不够就可以了。

经过你的指点,我貌似明白了,其实读写根本不用拷贝数据,直接操作自己的那块地址就行。
每个人一个指针
struct Data *const user1_data = pData + 0;
struct Data *const user2_data = pData + 1;
struct Data *const user3_data = pData + 2;
struct Data *const user4_data = pData + 3;
每个用户直接操作指针就可以了
是不是?
此帖出自编程基础论坛
 
 
 

回复

6040

帖子

196

TA的资源

版主

7
 

小孩子过家家,大人别掺和。
此帖出自编程基础论坛
 
 
 

回复

6423

帖子

16

TA的资源

版主

8
 
*(UINT32 *)0xB0001000 = xxxxxxxx
此帖出自编程基础论坛
 
个人签名training
 
 

回复

6423

帖子

16

TA的资源

版主

9
 
白丁 发表于 2015-6-15 22:11
*(UINT32 *)0xB0001000 = xxxxxxxx

掉电存储的话,读还可以,写好像不行
此帖出自编程基础论坛
 
个人签名training
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

10
 
lcofjp 发表于 2015-6-15 22:06
经过你的指点,我貌似明白了,其实读写根本不用拷贝数据,直接操作自己的那块地址就行。
每个人一个指针
struct Data *const user1_data = pData + 0;
struct Data *const user2_data = pData + 1;
struct Data *const user3_data = pData + 2;
struct Data *const user4_data = pData + 3;
每个用户直接操作指针就可以了
是不是?

对嗒,8过,还可以更加直接一点。
此帖出自编程基础论坛
 
个人签名

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

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

11
 
白丁 发表于 2015-6-15 22:11
*(UINT32 *)0xB0001000 = xxxxxxxx

8错8错,继续往下走
你的写法和他比,着眼点有一点不同。

这个写法和上一个写法可以互相启发互相补充的。
此帖出自编程基础论坛
 
个人签名

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

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

12
 
白丁 发表于 2015-6-15 22:15
掉电存储的话,读还可以,写好像不行

写可以。类似的方法而已。
此帖出自编程基础论坛
 
个人签名

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

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

13
 
lcofjp 发表于 2015-6-15 22:06
经过你的指点,我貌似明白了,其实读写根本不用拷贝数据,直接操作自己的那块地址就行。
每个人一个指针
struct Data *const user1_data = pData + 0;
struct Data *const user2_data = pData + 1;
struct Data *const user3_data = pData + 2;
struct Data *const user4_data = pData + 3;
每个用户直接操作指针就可以了
是不是?

另外要特别小心 光定义指针是不够的,还要有实际的空间被它指向。
此帖出自编程基础论坛
 
个人签名

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

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

14
 
白丁 发表于 2015-6-15 22:11
*(UINT32 *)0xB0001000 = xxxxxxxx

其实你这个语句就是在写。
此帖出自编程基础论坛
 
个人签名

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

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

15
 
提示一下:
要学会把 数组 指针 变量名 等这些东西 都当成一个地址来看。
特别是要理解
对他们的操作 背后的实质是 在操作什么。

(假如你能理解 左值右值 的区别)
此帖出自编程基础论坛
 
个人签名

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

 
 

回复

1377

帖子

2

TA的资源

五彩晶圆(初级)

16
 
struct UserData * userdata =(struct UserData *)0xB0001000;  /* 内存首址 */

直接操作,比如
  userdata[0].x_flag  = 'A';
  userdata[1].account++;
  puts(userdata[2].rec);
  printf("%f", userdata[3].last[5]);
此帖出自编程基础论坛
 
 
 

回复

2453

帖子

19

TA的资源

五彩晶圆(中级)

17
 
定义绝对位置变量,类似struct Data code my_data[4] _at_ 0x4000;
????
此帖出自编程基础论坛
 
个人签名    懒得很
 
 

回复

954

帖子

0

TA的资源

纯净的硅(初级)

18
 
我觉得首先应该在段定义文件中定义一个存储段,不然都是白搭。
比如代码段 数据段 usedata 存储段 。。。。。。。。
那么我们就可以把数据存在usedata段中

至于其他的好像没想到其他办法,都是定义一个绝对指针指向那个usedata段的地址。,挨个挨个把数据存进去
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

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

那是链接阶段干的事。

用不着,标准C语法就可以了。
不要去干该让编译器干的事
此帖出自编程基础论坛
 
个人签名

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

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

20
 
zca123 发表于 2015-6-16 10:20
定义绝对位置变量,类似struct Data code my_data[4] _at_ 0x4000;
????

除了51,别的地方你都用不了。
当年我第一反应也是这个。

后来想了想,即使这样搞也没什么特别。
和他们前面干的事本质上没差别
此帖出自编程基础论坛
 
个人签名

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

 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表