嵌入式基础
信息安全系统有时间戳的需求,因此密码系统有实时钟芯片。假设实时钟芯片的IO 映像基址是 全局变量unsignted int TIME的指针地址,时间存放在(基址+2)的寄存器中(默认值为当前时间),寄存器是 16位,结构如附件中图所示
- 按照下图给出TIME的注释(6‘)
- 定义基于16位寄存器的宏(4‘)
- 使用至少两种方式(位运算,位域)完成如下功能,实现在timeXXXX1.c,timeXXXX2.c模块中(XXXX为你的四位学号),模块头文件为timeXXXX.h(30')
void setHour(int hour)
int getHour() - 完成mainXXXX.c测试模块,测试你完成的代码,setHour的参数至少包含一条(你的学号%24)的值(10’)
按照下图给出TIME的注释
- 置位
?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)
提取位
插入位
- 由于Seconds占5位,因此需要先右移5位将Minutes的最低位与位0对齐,再与上3F(0000 0000 0011 1111)即可将6-15位全部清0,则获得minute部分。
- 0x3F出处为:对于minute一共有6bit,即(111111)2,转换为16进制即为0x3F;
定义基于16位寄存器的宏
// 置位
#define SET_BIT_16(reg, bit) ((reg) |= (1 << (bit)))
// 清除
#define CLR_BIT_16(reg, bit) ((reg) &= ~(1 << (bit)))
// 反转位
#define FLIP_BIT_16(reg, bit) ((reg) ^= (1 << (bit)))
// 示例使用
unsigned short registerValue = 0xABCD; // 16位寄存器的默认值
// 置位第 7 位
SET_BIT_16(registerValue, 7);
// 清除第 7 位
CLR_BIT_16(registerValue, 7);
// 反转第 6 位
FLIP_BIT_16(registerValue, 6);
void setHour(int hour) 和 int getHour()
方式一:使用位运算
// timeXXXX1.c
#include "timeXXXX.h"
void setHour(int hour)
{
int oldtime = TIME;
int newtime = oldtime & ~(0x1F << 11); // 清除原来的 Hours
newtime |= (hour & 0x1F) << 11; // 设置新的 Hours
TIME = newtime;
}
int getHour()
{
int time = TIME;
return (time >> 11) & 0x1F;
}
方式二:使用位域
// timeXXXX2.c
#include "timeXXXX.h"
struct TimeRegister {
unsigned int reserved : 11; // 保留位
unsigned int hour : 5; // 小时位
};
void setHour(int hour)
{
struct TimeRegister *timeReg = (struct TimeRegister *)&TIME;
timeReg->hour = hour & 0x1F; // 设置新的 Hours
}
int getHour()
{
struct TimeRegister *timeReg = (struct TimeRegister *)&TIME;
return timeReg->hour;
}
共用的头文件 timeXXXX.h
// timeXXXX.h
#ifndef TIME_XXXX_H
#define TIME_XXXX_H
#define Time_Addr 0xFFFFC0000
#define TIME (*(volatile int *)(Time_Addr + 2))
void setHour(int hour);
int getHour();
#endif // TIME_XXXX_H
标签:setHour,hour,int,void,基础,嵌入式,TIME,20211327,struct
From: https://www.cnblogs.com/shen-jianxiang/p/17921936.html