首页 > 其他分享 >嵌入式基础问题1,2,3

嵌入式基础问题1,2,3

时间:2023-12-22 16:35:39浏览次数:39  
标签:int MASK TIME 基础 嵌入式 问题 second 寄存器 define

图片中的寄存器结构表示了一个16位的时间格式,其中包含了小时、分钟和秒。这个16位的寄存器被分为三个部分:

  • 位15到位11表示小时(Hours),总共5位。
  • 位10到位5表示分钟(Minutes),也是6位。
  • 位4到位0表示秒(Seconds),这里注意到是“Seconds + 2”,意味着这5位的值需要加上2才是实际的秒数。

这样的设计通常用于嵌入式系统或硬件级时间管理。

  1. 首先,给出TIME的注释,以便于其他开发者理解这个地址映射到的寄存器的结构。注释可以这样写:
// TIME寄存器地址映射
// | 15 - 11 |    10 - 5    |   4 - 0   |
// |  Hours  |    Minutes   | Seconds+2 |
// TIME地址指向的16位寄存器,高5位为小时,接下来6位为分钟,低5位表示实际秒数加2。
  1. 定义基于16位寄存器的宏,用于从这个寄存器中获取实际的小时、分钟和秒数:
#define HOURS_MASK 0xF800  // 小时掩码,用于获取小时的值
#define MINUTES_MASK 0x07E0 // 分钟掩码,用于获取分钟的值
#define SECONDS_MASK 0x001F // 秒掩码,用于获取秒的值(需要减去2)

#define GET_HOURS(time) (((time) & HOURS_MASK) >> 11) // 获取小时
#define GET_MINUTES(time) (((time) & MINUTES_MASK) >> 5) // 获取分钟
#define GET_SECONDS(time) (((time) & SECONDS_MASK) << 1) // 获取秒数并减去2

在使用这些宏时,你需要提供16位的时间寄存器值作为参数time。例如,如果你想获取时间寄存器的小时数,可以使用GET_HOURS(TIME)。这里的TIME应该是一个16位的数值,代表时间寄存器当前的值。
要实现setSecondgetSecond函数,我们可以使用两种不同的方法:位运算和位域。以下是两种方法的实现:

方法一:使用位运算

time11051.c文件中,你可以使用之前定义的宏,或者直接进行位操作。下面的代码示例使用了直接位操作的方式:

#include "time1105.h"

// 假设TIME为全局变量的指针地址,这里声明为外部变量以便链接
extern unsigned int *TIME;

void setSecond(int second) {
    // 确保传入的秒数是有效的
    second = second - 2; // 减去2以符合寄存器的存储方式
    *TIME = (*TIME & ~SECONDS_MASK) | ((second & SECONDS_MASK) << 1);
}

int getSecond() {
    return ((*TIME >> 1) & SECONDS_MASK) + 2;
}

time1105.h头文件中,声明这些函数和宏:

#ifndef TIME1105_H
#define TIME1105_H

#define SECONDS_MASK 0x001F // 秒掩码

void setSecond(int second);
int getSecond();

#endif // TIME1105_H

方法二:使用位域

time11052.c文件中,我们可以使用结构体和位域来访问特定的时间部分。这是一个更为直观和结构化的方法:

#include "time1105.h"

// 假设TIME为全局变量的指针地址,这里声明为外部变量以便链接
extern unsigned int *TIME;

typedef struct time_struct {
    unsigned int seconds : 5;
    unsigned int minutes : 6;
    unsigned int hours : 5;
} TimeStruct;

void setSecond(int second) {
    TimeStruct *timePtr = (TimeStruct *)TIME;
    timePtr->seconds = second - 2; // 减去2以符合寄存器的存储方式
}

int getSecond() {
    TimeStruct *timePtr = (TimeStruct *)TIME;
    return timePtr->seconds + 2;
}

time1105.h头文件中,你只需要声明这两个函数,因为位域结构是在.c文件中定义的:

#ifndef TIME1105_H
#define TIME1105_H

void setSecond(int second);
int getSecond();

#endif // TIME1105_H

请注意,为了简化代码,我假设TIME是一个全局变量的指针地址,并且已经在某个地方声明和初始化。如果TIME是一个宏定义的地址,那么你需要根据实际情况对代码进行相应的调整。同样,这里的SECONDS_MASK宏和位域的具体数值可能需要根据实际的时间寄存器地址和位模式进行调整。

标签:int,MASK,TIME,基础,嵌入式,问题,second,寄存器,define
From: https://www.cnblogs.com/liyishi1110/p/17921873.html

相关文章

  • Flutter子工程编译,Ruby升级及Cocoapods安装问题集
    背景:工程为iOS原生与Flutter混合开发的工程,在编译Flutter子工程的过程中报了一个错,一度让我以为是ruby与pod的版本不兼容导致了一些奇奇怪怪的问题,随即来回折腾了Ruby环境升级与pod的升级安装。问题1:flutter子工程执行了flutterpubget,执行flutterbuildios--no-codesign时,报......
  • 嵌入式基础
    time1317.h文件位运算使用位域实现main1317函数1317%24为21,结果输出。......
  • day 03-3 Python基础-运算符
    3.运算符3.1常见的运算符算数运算符运算符描述示例+加-减*乘/除%取模-返回除法的余数10%3结果输出1**指数-幂,x的y次幂2**3结果输出位8//整除-返回商的整数部分9//2结果输出为49.0//2.0结果输出位4.0比较运算符运算符......
  • 计算机 JAVA 语言的基础小总结
    计算机JAVA语言的基础小总结一维数组和二维数组的定义及初始化在Java中,数组是一种数据结构,用于存储多个数据。数组中的元素是相同类型的数据。数组是一个引用数据类型,数组的变量只是一个引用,数组元素和数组变量在内存里是分开存放的。一维数组的定义和初始化一维数组在Jav......
  • [问题记录] C# 使用NPOI操作Excel模版写入数据 - 生成文件打开时提示 "发现 XXX.xlsx
    解决方案:1.先确保原来的模版文件打开是正常的,没有提示要恢复2.用Office打开这个模版文件,另存为一个文件。用这个文件来作为模版使用。 问题描述:使用C#NPOI操作Excel模版(模版用office打开是正常的),写入数据,导出的文件打开时提示是否尝试恢复,点击“是”后,发现Excel内......
  • 解决ts中的类型问题:利用any类型污染来实现
    nestjs用request.user可以获取到passport中自己编写的策略返回的值,但是使用这个user中的数据时,就显示返回的user值的类型中没有其他数据。使用ctrl+鼠标点一下这个user,跳转到passport依赖的一个文件中,原来这个user是定义了一个接口,里面是空的。如果使用这个接口来做类型,好处是可以......
  • Python DRF基础使用01
    目录1,web应用模式(了解)2,restful风格介绍(了解)3,restful设计风格(了解)4,restful案例(了解)5,数据准备6,查询所有数据(理解)7,创建对象(理解)8,获取单个对象(理解)9,修改单个对象(理解)10,删除单个对象(理解)11,DRF魅力展示(了解)12,序列化器概述(了解)13,序列化器定义(掌握)1......
  • Python DRF基础使用02
    目录1,ModelSerializer2,fields3,read_only_fields4,extra_kwargs5,APIView之request6,APIView之Response7,APIView实现列表视图8,APIView实现详情视图(带着id请求,所以叫做详情)9,二级视图,实现列表视图10,二级视图,实现详情视图11,get_object方法(三属性三方法其中一个)12,MiXin(提......
  • 01--python基础回顾
    一关于爬虫的特殊性1.网站的多变性:这个是爬虫的魅力.要全方位的去思考.就像找漏洞一样.思维逻辑不可能是固定的达到目的即可,不要死磕牛角尖2.访问频率调低爬虫程序如果编写的不够完善.访问频率过高.很有可能会对服务器造成毁灭性打击所以不要死盯着一个网站干.请......
  • 内蒙古某市财政提升IT基础监控运维案例剖析
    随着信息化建设的不断推进,内蒙古某市财政局的网络及运维管理面临着越来越多的挑战。为了解决这些问题,该财政局引入了监控易管理平台7.0,从而提升了IT基础监控的运行效率。一、现状与挑战随着财政局信息化的不断推进,其网络及运维管理面临着诸多问题。首先,该财政局的网络架构复杂,设备......