zoukankan      html  css  js  c++  java
  • 20155218 《嵌入式基础》

    20155218 《嵌入式基础》

    要求:

    在作业本上完成附图作业,要认真看题目要求。
    提交作业截图
    作弊本学期成绩清零(有雷同的,不管是给别人传答案,还是找别人要答案都清零)
    

    课上做错的内容:

    1. C语言对寄存器的操作;
    2. 提取位和插入位的设置;

    课下补充实践:

    1. C语言对寄存器的操作;

    在嵌入式开发中,我们需要对寄存器进行写入,读出等等操作。每个寄存器都有自己固有的地址,我们需要通过C语言访问这些地址。

    #define Time_Addr 0xFFFFC0000;
    #define Time        *(volatile  int *)(Time_Addr+2)
    

    该寄存器是16位的,因为要避免程序执行过程中直接从cache中读取数据,所以用volatile进行修饰。每次都要重新读取该地址上的值。首先(volatile int)是一个指针,我们就假设它为p吧。它存储的地址就是后面的(Time_Addr+2),然后取这个地址的值,也就是p,接下来我们就能直接赋值给Time来改变地址上(Time_Addr+2)存储的值了。

    2. 提取位和插入位的设置;

    • 在课上的时候我没注意就写了一个0x3F;其实hours和和seconds都只占用了5位,应该为00000000000011111,即十六进制的0x1F;
    • 在hours中需要将数据右移11位然后和0x1F进行&运算,将其余各位清零,只保留hours,即可得到hours;
    • 在seconds中不需要移位,但我们看到“seconds➗2”的标志,这是因为hour=24,minute=60,seconds=60,各需要5位,6位,6位;但是寄存器只有16位,需要seconds需要➗2;

    代码:

    hours:

    #define Time_Addr 0xFFFFC0000;
    #define Time        *(volatile  int *)(Time_Addr+2)
    void sethours(int hours)
    {
        int oldtime,newtime;
        oldtime =Time;
        newtime =oldtime&~(0x1F<<11);
        Time =newtime|(hours<<11);
    }
    void getseconds()
    {
        int time =Time;
        return (time>>11)&0x1F;
    }
    
    

    seconds:

    #define Time_Addr 0xFFFFC0000;
    #define Time        *(volatile  int *)(Time_Addr+2)
    void setseconds(int seconds)
    {
        int oldtime,newtime;
        oldtime =Time;
        newtime =oldtime&~0x1F;
        Time =newtime|seconds;
    }
    void getseconds()
    {
        int time =Time;
        return time&0x1F;
    }
    
    
  • 相关阅读:
    hdu 1348【凸包模板】
    hdu 3007【最小圆覆盖-随机增量法模板】
    poj 2187【旋转卡壳模板】
    bzoj 2618【半平面交模板】
    hdu1115【多边形求重心模板】
    bzoj 1006: [HNOI2008]神奇的国度【弦图+LesBFS】
    bzoj 3456: 城市规划【NTT+多项式求逆】
    bzoj 2194: 快速傅立叶之二【NTT】
    bzoj 4555: [Tjoi2016&Heoi2016]求和【NTT】
    bzoj 4842: [Neerc2016]Delight for a Cat【最小费用最大流】
  • 原文地址:https://www.cnblogs.com/xzh1996/p/8184295.html
Copyright © 2011-2022 走看看