2017-2018-1 20155315 《信息安全系統設計基礎》嵌入式C語言測試
Hours
要求
偽代碼
- 提取Hours
提取時間地址
時間存放在(基址+2)的16位寄存器中,定義一個時間宏存放地址。#define Time_Addr 0xFFFFC0000 #define TIME *(volatile int *) (Time_Addr+2)
根據結構圖,Hours占5位,其地址與時間地址的偏移量為11,因此提取數值的時候將原數值右移11位。
time>>11
右移後將數值與0x1F(00011111),將數值的低五位提取出來,也就是Hours
(time>>11)&0x1F
- 設置Hours
將原Hours置0
newtime = oldtime & ~(0x1F<<11);
將Hours左移11位,其他位為0,這樣將左移後的Hours或上一步的時間後,就將Hours設置到新的時間中
newtime =newtime | ((hours&0x1F)<<11);
代碼實現
```
define Time_Addr 0xFFFFC0000
define TIME (volatile int ) (Time_Addr+2)
int gethours()
{
int time = TIME;
return (time>>11)&0x1F;
}
void sethours(int hours)
{
int oldtime = TIME;
int newtime = oldtime & ~(0x1F<<11);
newtime =newtime | ((hours&0x1F)<<11);
TIME=newtime;
}
## minutes
define Time_Addr 0xFFFFC0000
define TIME (volatile int ) (Time_Addr+2)
int getminutes()
{
int time = TIME;
return (time>>5)&0x3F;
}
void setminutes(int minutes)
{
int oldtime = TIME;
int newtime = oldtime & ~(0x3F<<5);
newtime =newtime | ((minutes&0x3F)<<5);
TIME=newtime;
}
## seconds
define Time_Addr 0xFFFFC0000
define TIME (volatile int ) (Time_Addr+2)
int getseconds()
{
int time = TIME;
return time&0x1F;
}
void setseconds(int hours)
{
int oldtime = TIME;
int newtime = oldtime & ~0x1F;
newtime =newtime | (seconds&0x1F);
TIME=newtime;
}
```
總結
2017-2018-1 20155315 《信息安全系統設計基礎》嵌入式C語言測試