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
}