课后实践之嵌入式基础20155314

课后实践之嵌入式基础

任务详情

在作业本上完成附图作业,要认真看题目要求。

提交作业截图

作弊本学期成绩清零(有雷同的,不管是给别人传答案,还是找别人要答案都清零)

预备知识

嵌入式C语言——嵌入式系统中的数据打包

  1. 地址的定义

    #define DATA_Addr 0x0C00000
    #define DATA *(volatile int *)(DATA_Addr)
    DATA = 0x1234;
  2. 提取位
    • 提取Minutes:

      分析:由于Seconds占5位,因此需要先右移5位将Minutes的最低位与位0对齐,再与(&)上3F(0000 0000 0011 1111)即可将6-15位全部清0从而取出Minutes的全部6位

      假设Hours的5位全为A,Minutes的6位全为B,则:

          00000 00000 111111
      &   ????? AAAAA BBBBBB
      =   00000 00000 BBBBBB 
    • 提取Hours:

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

      假设Hours的5位全为C,Minutes的6位全为B,则:

          00000 000000 11111
      &   ????? ?????? CCCCC
      =   00000 000000 CCCCC 
    • 提取Seconds:

      分析:由于Seconds占低5位,因此无需右移最低位即与位0对齐,只需与(&)上1F(0000 0000 0001 1111)即可将5-15位全部清0从而取出Seconds的全部5位

      假设Seconds的5位全为A,Minutes的6位全为B,Hours的5位全为C,则:

          00000 000000 11111
      &   CCCCC BBBBBB AAAAA
      =   00000 000000 AAAAA 
  3. 插入位(插入Minutes)

关于volatile关键字

  • volatile关键字的官方说明

    Indicates that a variable can be changed by a background routine.

    Keyword volatile is an extreme opposite of const. It indicates that a variable may be changed in a way which is absolutely unpredictable by analysing the normal program flow (for example, a variable which may be changed by an interrupt handler). This keyword uses the following syntax: volatile data-definition;

    Every reference to the variable will reload the contents from memory rather than take advantage of situations where a copy can be in a register.

    大概意思是说,一个变量如果用volatile修饰,则会从内存中重新装载其内容,而不是直接从寄存器中拷贝其内容

  • 使用volatile关键字的目的
    • 让对volatile变量的存取不能缓存到寄存器,每次使用时需要重新存取
  • 嵌入式系统编程,要求程序员能够利用C语言访问固定的内存地址,根据C语言的语法规则,这个表示地址的量应该是指针类型。以上面的地址定义为例:

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

    意思是初始化内存地址0x0C00000的值为0x1234,这里的DATA_Addr就是内存地址0x0C00000。则在知道要访问的内存地址后,执行以下两步:

    1. 把它强制转换为指针类型(int *)(DATA_Addr)

      则地址0x0C00000强制转换为指向int类型

    2. 对指针变量解引用*(volatile int *)(DATA_Addr),就能操作指针所指向的地址的内容了

    注:把#define宏中的参数用括号括起来,这是一个很好的习惯。不用括号易导致出错,如本题的时间存放在基址+2的寄存器中,应写成#define TIME *(volatile int *)(Time_Addr+2),稍不注意就容易写成#define TIME *(volatile int *) Time_Addr+2导致错误!

最终代码

#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 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;
}

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
}

参考资料

原文地址:https://www.cnblogs.com/crazymosquito/p/8185803.html

时间: 2024-10-30 05:11:45

课后实践之嵌入式基础20155314的相关文章

20155218 《嵌入式基础》

20155218 <嵌入式基础> 要求: 在作业本上完成附图作业,要认真看题目要求. 提交作业截图 作弊本学期成绩清零(有雷同的,不管是给别人传答案,还是找别人要答案都清零) 课上做错的内容: C语言对寄存器的操作: 提取位和插入位的设置: 课下补充实践: 1. C语言对寄存器的操作: 在嵌入式开发中,我们需要对寄存器进行写入,读出等等操作.每个寄存器都有自己固有的地址,我们需要通过C语言访问这些地址. #define Time_Addr 0xFFFFC0000; #define Time *

软件工程——理论、方法与实践 之 面向对象基础

软件工程——理论.方法与实践 之 面向对象基础 面向对象技术是软件工程领域中的重要技术,这种技术比较自然的模拟了人类认识客观世界的方式,是当前计算机软件工程学中的主流方法.面向对象方法认为:客观世界是由对象组成的,任何客观的事物或实体都是对象,复杂的对象可以由简单的对象组成:具有相同数据和相同操作的对象可以归并为一个类,对象是对象类的一个实例:类可以派生出子类,子类继承父类的全部特性(数据和操作),又可以有自己的新特征,子类与父类形成类的层次结构:对象之间通过消息传递相互联系:类具有封装性,其数

Oracle实践--PL/SQL基础之同义词和序列

PL/SQL基础入门之同义词和序列             PL/SQL:过程语言(Procedure  Language)和结构化语言(Structured Query Language)结合而成的编程语言,是对SQL的扩展,支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制语句,可创建存储过程,程序包和触发器等,给sql语句的执行添加程序逻辑,与Oracle服务器和Oracle工具紧密集成,具有可移植性,灵活性和安全性. 同义词: /*     同义词:现有对象的一个别名:    

Oracle实践--PL/SQL基础之表分区

PL/SQL基础入门之表分区 PL/SQL:过程语言(Procedure  Language)和结构化语言(Structured Query Language)结合而成的编程语言,是对SQL的扩展,支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制语句,可创建存储过程,程序包和触发器等,给sql语句的执行添加程序逻辑,与Oracle服务器和Oracle工具紧密集成,具有可移植性,灵活性和安全性. ---------------------------------------------

Oracle实践--PL/SQL基础之代码块

PL/SQL基础入门之代码块 PL/SQL:过程语言(Procedure  Language)和结构化语言(Structured Query Language)结合而成的编程语言,是对SQL的扩展,支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制语句,可创建存储过程,程序包和触发器等,给sql语句的执行添加程序逻辑,与Oracle服务器和Oracle工具紧密集成,具有可移植性,灵活性和安全性. 优点: 1.       支持SQL,可以使用:DML,DCL,游标控制和SQL运算符 2

Oracle实践--PL/SQL基础之游标

PL/SQL基础入门之游标 PL/SQL:过程语言(Procedure  Language)和结构化语言(Structured Query Language)结合而成的编程语言,是对SQL的扩展,支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制语句,可创建存储过程,程序包和触发器等,给sql语句的执行添加程序逻辑,与Oracle服务器和Oracle工具紧密集成,具有可移植性,灵活性和安全性. ----------------------------------------------

Oracle实践--PL/SQL基础之视图和索引

PL/SQL基础入门之视图和索引         PL/SQL:过程语言(Procedure  Language)和结构化语言(Structured Query Language)结合而成的编程语言,是对SQL的扩展,支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制语句,可创建存储过程,程序包和触发器等,给sql语句的执行添加程序逻辑,与Oracle服务器和Oracle工具紧密集成,具有可移植性,灵活性和安全性. -----------------------------------

Oracle实践--PL/SQL基础之存储过程

PL/SQL基础之存储过程 存储过程:过程是用于完成特定任务的子程序(代码的集合) /* 子程序的优点:1.模块化,将程序分解为逻辑模块: 2.可重用性,可以被任意数目的程序调用: 3,可维护性,简化维护操作: 4.安全性:通过设置权限,使数据更安全 */ --存储过程1,打印HelloWorld create or replace procedure my_pro is --用于声明一些变量 v_string varchar2(20) :='helloworld!'; begin dbms_o

Oracle实践--PL/SQL基础之函数

PL/SQL基础之函数 /* 函数:可以有返回值得命名的PL/SQL子程序,必须有返回值 关键字:function return */ --函数1 create or replace function helloworld return varchar2--指定返回类型,不能给定长度 as v_hello varchar2(50); begin v_hello :='helloworld!'; return v_hello;--不可少的return end; --函数调用方式: select h