您的位置:首页 > 编程语言 > C语言/C++

20155308《信息安全系统设计基础 嵌入式C语言课堂考试补博客

2018-01-04 20:48 357 查看

20155308《信息安全系统设计基础 嵌入式C语言课堂考试补博客

知识点

置位

?bits = bits | (1 << 7) ;  /* sets bit 7 */


bits |= (1 << 7) ;   /* sets bit 7 */


#define SET_BIT (n,bits) do{bits |= (1<<n)}while(0)


清除

bits &= ~(1 << 7) ;    /* clears bit 7 */


#define CLR_BIT (n,bits) do{bits &=~ (1<<n)}while(0)


反转位

bits  ^=  (1 << 6) ;   /* flips bit 6 */


#define FLIP_BIT (n,bits) do{bits ^= (1<<n)}while(0)


PPT上事例

提取位



插入位



理解代码

由于Seconds占5位,因此需要先右移5位将Minutes的最低位与位0对齐,再与上3F(0000 0000 0011 1111)即可将6-15位全部清0,则获得minute部分。

0x3F出处为:对于minute一共有6bit,即(111111)2,转换为16进制即为0x3F;

地址的定义

#define DATA_Addr 0x0C00000
#define DATA *(volatile int *)(DATA_Addr)
DATA = 0x1234;


最终代码

#define Time_Addr 0xFFFFC0000 //实时钟芯片的IO映像基址是OxFFFFC0000
#define TIME *(volatile int *)(Time_Addr+2) //时间存放在基址+2的寄存器中
void SetMinutes(int minutes) //插入Minutes
{
int oldtime=TIME;
int newtime;
newtime=oldtime&~(0x3F<<5);
newtime|=(minutes&0x3F)<<5;
TIME=newtime;
}
int getMinutes() //取出Minutes
{
int time=TIME;
return (time>>5)&0x3F;
}

课上考试题



理解代码

由于Seconds占5位,Minutes占6位,因此需要先右移11位将Hours的最低位与位0对齐,再与上1F(0000 0000 0001 1111)即可将5-15位全部清0从而取出Hours的全部5位。

最终代码

#define Time_Addr 0xFFFFC0000 //实时钟芯片的IO映像基址是OxFFFFC0000
#define TIME *(volatile int *)(Time_Addr+2) //时间存放在基址+2的寄存器中
void SetHours(int hours) //插入Hours
{
int oldtime=TIME;
int newtime;
newtime=oldtime&~(0x1F<<11);
newtime|=(hours&0x1F)<<11;
TIME=newtime;
}
int getHours() //取出Hours
{
int time=TIME;
return (time>>11)&0x1F;
}


练习题



void SetSeconds(int seconds)

int Getseconds()

#define Time_Addr 0xFFFFC0000 //实时钟芯片的IO映像基址是OxFFFFC0000
#define TIME *(volatile int *)(Time_Addr+2) //时间存放在基址+2的寄存器中
void SetHours(int hours) //插入Hours
void SetSeconds(int seconds) //插入Seconds
{
int oldtime=TIME;
int newtime;
newtime=oldtime&~0x1F;
newtime|=(seconds/2)&0x1F;
TIME=newtime;
}
int getSeconds() //取出Seconds
{
int time=TIME;
return (time&0x1F)*2; //此处不考虑Seconds除2带来的误差,因此直接乘2
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐