2017-2018-1 20152515 第16周 嵌入式基础 课堂实践补做

时间:2022-12-09 19:24:51

题目要求

  • 在作业本上完成附图作业,要认真看题目要求。
  • 提交作业截图
  • 作弊本学期成绩清零(有雷同的,不管是给别人传答案,还是找别人要答案都清零)

2017-2018-1 20152515 第16周 嵌入式基础 课堂实践补做


错误原因:

  • 我把SetHours()和getHours()没理解清楚,首先两者就搞混了。

  • 关于return (time>>11) & 0x1F;,我写成了return (time>>11) & 0x3E;

  • 我意识到hours需要的是右移11位之后,取它低5位,但是对于“五个1”这个问题,我居然理解成了"0x3E",也就是"0x00111110",事实上,应该是"0x00011111".


老师曾在课上讲到关于地址的定义问题:

  • 地址的定义
#define DATA_Addr	0x0C00000
#define DATA *(volatile int *) DATA_Addr
DATA = 0x1234;
  • 对应的,这题中时间存放在(基址+2)的16位寄存器中,定义一个时间宏存放地址。
#define DATA_Addr	0xFFFFC000
#define DATA *(volatile int *) DATA_Addr+2
  • 提取时间的方法,老师的PPT中也有提及:

2017-2018-1 20152515 第16周 嵌入式基础 课堂实践补做2017-2018-1 20152515 第16周 嵌入式基础 课堂实践补做

  • 在本题中,根据结构图,Hours占5位,其地址与时间地址的偏移量为11,因此提取数值的时候将原数值右移11位,再将数值与0x1F(00011111),将数值的低五位提取出来,也就是Hours.

  • 正确答案:


#define DATA_Addr 0xFFFFC000
#define DATA *(volatile int *) DATA_Addr+2

void SetHours(int hours)
{
int oldtime = TIME;
int newtime = oldtime & ~ (0x1F << 11);
newtime |= (hours & 0x1F) << 11;
TIME = newtime;
}


int getHours()
{
int time = TIME;
return (time>>11) & 0x1F;
}

  • 附加题:分钟和秒的实现,同理可得:

  • 分钟:

void SetMinutes(int minutes) 
{
int oldtime=TIME;
int newtime;
newtime=oldtime&~(0x3F<<5); 1111是因为分钟是6位:第5-10位
newtime|=(minutes&0x3F)<<5;
TIME=newtime;

}
#define Time_Addr 0xFFFFC0000
#define Time *(volatile int *)(Time_Addr+2)
int getMinutes()
{
int time=TIME;
return (time>>5)&0x3F;
}
  • 秒:
void SetSeconds(int seconds)
{
int oldtime=TIME;
int newtime;
newtime=oldtime&~0x1F;
newtime|=(seconds/2)&0x1F;
TIME=newtime;

}
#define Time_Addr 0xFFFFC0000
#define Time *(volatile int *)(Time_Addr+2)
int getSeconds()
{
int time=TIME;
return (time&0x1F)*2;