20155325 2018-2017 1 20180103课堂嵌入式基础

要求

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

分析例子

提取minutes

一共16位,minutes占10-5+1=6位,seconds占4-0+1=5位

所以time>>5使得minutes被放到了最右边

为了只剩下minutes,故而要把16位中除后6位以外的数都变成0

所以要用0去&

又因为0000000000111111=0x3F

所以(time>>5)&0x3F

设置minutes

把原时间的分钟全部置零

按位与

0x3F<<5 = 0000011111100000

取反后1111100000011111

与原来的数相与,则minutes位置零

把上一步提取出来的分钟左移五位放置到正确的位置,再与新时间相或

提取和设置hours

取出时间

volatile

volatile是一个类型修饰符(type specifier),就像大家更熟悉的const一样,它是被设计用来修饰被不同线程访问和修改的变量。

volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。

volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。

结果

#define DATA 0xFFFFC0002 //IO映像基址是OxFFFFC0000,时间在基址+2
#define TIME *(volatile int *)(DATA) //类型转换

int getHours();

把时间从TIME取出来

hours一共5位,16-5=11,所以应该右移11位

0000000000011111 = 0x1f

int getHours() //取出Hours
{
    int time=TIME;
    return (time>>11)&0x1f;
}

void SetHours(int hours);

时间取到oldtime

0000000000011111 = 0x1f

1111100000000000 = 0x1f<<11

0000011111111111 = ~(0x1f<<11)

void SetHours(int hours) //插入Hours
{
    int oldtime=TIME;
    int newtime;
    newtime=oldtime&~(0x1F<<11);
    newtime|=(hours&0x1F)<<11;
    TIME=newtime;

}

方法二:

newtime=oldtime&7ff;
newtime|=(hours<<11)&f800;

int geSeconds();

int getSeconds() //取出Seconds
{
    int time=TIME;
    return time&0x1f;
}

void SetSeconds(int Seconds);

1111111111100000 = 0xffe0

{
    int oldtime=TIME;
    int newtime;
    newtime = oldtime&0xffe0;
    newtime|= Seconds&0x1F;
    TIME=newtime;

}
posted @ 2018-01-06 16:05  难能可贵成功犯傻  阅读(205)  评论(1编辑  收藏  举报