20211327 嵌入式基础

嵌入式基础

信息安全系统有时间戳的需求,因此密码系统有实时钟芯片。假设实时钟芯片的IO 映像基址是 全局变量unsignted int TIME的指针地址,时间存放在(基址+2)的寄存器中(默认值为当前时间),寄存器是 16位,结构如附件中图所示

  1. 按照下图给出TIME的注释(6‘)
  2. 定义基于16位寄存器的宏(4‘)
  3. 使用至少两种方式(位运算,位域)完成如下功能,实现在timeXXXX1.c,timeXXXX2.c模块中(XXXX为你的四位学号),模块头文件为timeXXXX.h(30')
    void setHour(int hour)
    int getHour()
  4. 完成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
posted @ 2023-12-22 16:40  沈楗翔  阅读(9)  评论(0编辑  收藏  举报