Skip to content
Snippets Groups Projects
Commit 38a4e075 authored by Tom Feng's avatar Tom Feng
Browse files

clock does not work with q at the same time

parent a5184254
No related branches found
No related tags found
1 merge request!16Withtime
#ifndef __BWIO_H__
#define __BWIO_H__
/* /*
* bwio.h * bwio.h
* Copied from Bill Cowan /u/wbcowan/cs452/io/include/bwio.h
*/ */
typedef char *va_list; typedef char *va_list;
...@@ -37,3 +40,4 @@ int bwputr( int channel, unsigned int reg ); ...@@ -37,3 +40,4 @@ int bwputr( int channel, unsigned int reg );
void bwputw( int channel, int n, char fc, char *bf ); void bwputw( int channel, int n, char fc, char *bf );
void bwprintf( int channel, char *format, ... ); void bwprintf( int channel, char *format, ... );
#endif
#ifndef __CMD_H__
#define __CMD_H__
#define CMD_HALT 0
int ListenCommand();
#endif
#ifndef __CANVAS_H__ #ifndef __CANVAS_H__
#define __CANVAS_H__ #define __CANVAS_H__
#include <bwio.h>
#include <myclock.h>
/*
* The Cursor Addressing Macro is provided by
* courseweb.stthomas.edu/tpsturm/private/notes/qm300/ANSI.html
*/
void DrawClock(int* ClockCount); #define ESC_CANVAS 27
#define CLEAR_SCREEN bwprintf(COM2, "%c[2J", ESC_CANVAS)
#define MOVE_UP(Num) bwprintf(COM2, "%c[%dA", ESC_CANVAS)
#define MOVE_DOWN(Num) bwprintf(COM2, "%c[%dB", ESC_CANVAS)
#define MOVE_LEFT(Num) bwprintf(COM2, "%c[%dD", ESC_CANVAS,Num)
#define MOVE_RIGHT(Num) bwprintf(COM2, "%c[%dC", ESC_CANVAS,Num)
#define CURSOR_POS(Row, Col) bwprintf(COM2, "%c[%d;%dH",ESC_CANVAS, Row, Col)
void DrawLine_H(const char Element, const int Length);
void DrawLine_V(const char Element, const int Length);
void DrawPanel();
void DrawClock(Clock* MyClock);
#endif #endif
#ifndef __CANVAS_H__
#define __CANVAS_H__
void DrawClock();
#endif
...@@ -3,8 +3,16 @@ ...@@ -3,8 +3,16 @@
#define CLOCK_LOAD_VALUE 50800 #define CLOCK_LOAD_VALUE 50800
typedef struct
{
unsigned int ClockCount;
unsigned int LastTimerValue;
char bChanged;
} Clock;
// initialize the global time to 0 // initialize the global time to 0
void InitClockCount(int *ClockCount, int* LastTimerValue); void InitClockCount(Clock* MyClock);
// update the time count from start of the program // update the time count from start of the program
void UpdateClock(int* ClockCount, int* LastTimerValue); void UpdateClock(Clock* MyClock);
#endif #endif
#ifndef __MY_CLOCK_H__
#define __MY_CLOCK_H__
#define CLOCK_LOAD_VALUE 50800
volatile static unsigned int ClockCount;
// initialize the global time to 0
void InitClockCount(int *ClockCount, int* LastTimerValue);
// update the time count from start of the program
void UpdateClock(int* ClockCount, int* LastTimerValue);
#endif
...@@ -19,7 +19,7 @@ ARFLAGS = rcs ...@@ -19,7 +19,7 @@ ARFLAGS = rcs
LDFLAGS = -init main -Map first.map -N -T orex.ld -L/u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2 -L../lib LDFLAGS = -init main -Map first.map -N -T orex.ld -L/u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2 -L../lib
all: startup.elf #first.elf all: startup.elf clocktest.elf
startup.s: startup.c startup.s: startup.c
$(XCC) -S $(CFLAGS) startup.c $(XCC) -S $(CFLAGS) startup.c
...@@ -28,8 +28,27 @@ startup.o: startup.s ...@@ -28,8 +28,27 @@ startup.o: startup.s
$(AS) $(ASFLAGS) -o startup.o startup.s $(AS) $(ASFLAGS) -o startup.o startup.s
startup.elf: startup.o startup.elf: startup.o
$(LD) $(LDFLAGS) -o $@ startup.o -lmycanvas -lmyclock -lbwio -lgcc $(LD) $(LDFLAGS) -o $@ startup.o -lmycanvas -lmyclock -lcmd -lbwio -lgcc
clocktest.s: clocktest.c
$(XCC) -S $(CFLAGS) clocktest.c
clocktest.o: clocktest.s
$(AS) $(ASFLAGS) -o clocktest.o clocktest.s
clocktest.elf: clocktest.o
$(LD) $(LDFLAGS) -o $@ clocktest.o -lbwio -lgcc
getc.s: getc.c
$(XCC) -S $(CFLAGS) getc.c
getc.o: getc.s
$(AS) $(ASFLAGS) -o getc.o getc.s
getc.elf: getc.o
$(LD) $(LDFLAGS) -o $@ getc.o -lbwio -lgcc
clean: clean:
-rm -f first.elf *.s *.o startup.map *.a *~ -rm -f *.elf *.s *.o startup.map *.a *~
#include <bwio.h>
#include <ts7200.h>
int main(){
bwsetfifo(COM2,OFF);
bwsetspeed(COM2, 115200);
volatile unsigned int Count;
unsigned int * load= (unsigned int *) (TIMER3_BASE + LDR_OFFSET);
unsigned int * control= (unsigned int *) (TIMER3_BASE + CRTL_OFFSET);
unsigned int * read = (unsigned int *) (TIMER3_BASE + VAL_OFFSET);
*load = 508000;
*control = ENABLE_MASK | (MODE_MASK | CLKSEL_MASK);
while(1){
Count = *read;
//bwprintf(COM2,"LOAD: %d\n\r", *load);
bwprintf(COM2,"VAL: %d\n\r", Count);
}
return 0;
}
Archive member included because of file (symbol) Archive member included because of file (symbol)
../lib/libmycanvas.a(mycanvas.o) ../lib/libbwio.a(bwio.o) clocktest.o (bwsetfifo)
startup.o (DrawClock)
../lib/libmyclock.a(myclock.o)
startup.o (InitClockCount)
../lib/libbwio.a(bwio.o) startup.o (bwsetfifo)
/u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_udivsi3.o) /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_udivsi3.o)
../lib/libbwio.a(bwio.o) (__udivsi3) ../lib/libbwio.a(bwio.o) (__udivsi3)
/u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_umodsi3.o) /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_umodsi3.o)
...@@ -32,66 +28,53 @@ bss 0x0000000000000000 0x0 ...@@ -32,66 +28,53 @@ bss 0x0000000000000000 0x0
*(.bss) *(.bss)
0x0000000000000000 _BssEnd = . 0x0000000000000000 _BssEnd = .
text 0x0000000000000000 0x133c text 0x0000000000000000 0xef0
*(.text) *(.text)
.text 0x0000000000000000 0x17c startup.o .text 0x0000000000000000 0xa4 clocktest.o
0x000000000000010c main 0x0000000000000000 main
0x0000000000000000 initialize .text 0x00000000000000a4 0xc54 ../lib/libbwio.a(bwio.o)
0x00000000000000b0 runloop 0x000000000000041c bwputr
.text 0x000000000000017c 0x174 ../lib/libmycanvas.a(mycanvas.o) 0x0000000000000988 bwi2a
0x000000000000017c DrawClock 0x00000000000000a4 bwsetfifo
.text 0x00000000000002f0 0x140 ../lib/libmyclock.a(myclock.o) 0x0000000000000278 bwputc
0x00000000000002f0 InitClockCount 0x00000000000006d8 bwa2d
0x0000000000000394 UpdateClock 0x000000000000016c bwsetspeed
.text 0x0000000000000430 0xc54 ../lib/libbwio.a(bwio.o) 0x000000000000033c c2x
0x00000000000007a8 bwputr 0x0000000000000780 bwa2i
0x0000000000000d14 bwi2a 0x0000000000000620 bwgetc
0x0000000000000430 bwsetfifo 0x0000000000000844 bwui2a
0x0000000000000604 bwputc 0x00000000000009ec bwformat
0x0000000000000a64 bwa2d 0x0000000000000518 bwputw
0x00000000000004f8 bwsetspeed 0x0000000000000cc0 bwprintf
0x00000000000006c8 c2x 0x000000000000039c bwputx
0x0000000000000b0c bwa2i 0x000000000000049c bwputstr
0x00000000000009ac bwgetc .text 0x0000000000000cf8 0x110 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_udivsi3.o)
0x0000000000000bd0 bwui2a 0x0000000000000cf8 __udivsi3
0x0000000000000d78 bwformat 0x0000000000000df0 __aeabi_uidivmod
0x00000000000008a4 bwputw .text 0x0000000000000e08 0xcc /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_umodsi3.o)
0x000000000000104c bwprintf 0x0000000000000e08 __umodsi3
0x0000000000000728 bwputx .text 0x0000000000000ed4 0x4 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o)
0x0000000000000828 bwputstr 0x0000000000000ed4 __aeabi_ldiv0
.text 0x0000000000001084 0x110 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_udivsi3.o) 0x0000000000000ed4 __div0
0x0000000000001084 __udivsi3 0x0000000000000ed4 __aeabi_idiv0
0x000000000000117c __aeabi_uidivmod
.text 0x0000000000001194 0xcc /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_umodsi3.o)
0x0000000000001194 __umodsi3
.text 0x0000000000001260 0x4 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o)
0x0000000000001260 __aeabi_ldiv0
0x0000000000001260 __div0
0x0000000000001260 __aeabi_idiv0
*(.got) *(.got)
*(.got.plt) *(.got.plt)
.got.plt 0x0000000000001264 0xc startup.o .got.plt 0x0000000000000ed8 0xc clocktest.o
0x0000000000001264 _GLOBAL_OFFSET_TABLE_ 0x0000000000000ed8 _GLOBAL_OFFSET_TABLE_
*(.rodata) *(.rodata)
.rodata 0x0000000000001270 0x10 startup.o .rodata 0x0000000000000ee4 0xc clocktest.o
.rodata 0x0000000000001280 0x58 ../lib/libmycanvas.a(mycanvas.o)
.rodata 0x00000000000012d8 0x64 ../lib/libmyclock.a(myclock.o)
*(.glue_7) *(.glue_7)
*(.glue_7t) *(.glue_7t)
.rel.dyn .rel.dyn
LOAD startup.o LOAD clocktest.o
LOAD ../lib/libmycanvas.a
LOAD ../lib/libmyclock.a
LOAD ../lib/libbwio.a LOAD ../lib/libbwio.a
LOAD /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a LOAD /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a
OUTPUT(startup.elf elf32-littlearm) OUTPUT(clocktest.elf elf32-littlearm)
.comment 0x0000000000000000 0x48 .comment 0x0000000000000000 0x24
.comment 0x0000000000000000 0x12 startup.o .comment 0x0000000000000000 0x12 clocktest.o
.comment 0x0000000000000012 0x12 ../lib/libmycanvas.a(mycanvas.o) .comment 0x0000000000000012 0x12 ../lib/libbwio.a(bwio.o)
.comment 0x0000000000000024 0x12 ../lib/libmyclock.a(myclock.o)
.comment 0x0000000000000036 0x12 ../lib/libbwio.a(bwio.o)
.debug_line 0x0000000000000000 0x14f .debug_line 0x0000000000000000 0x14f
.debug_line 0x0000000000000000 0x86 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_udivsi3.o) .debug_line 0x0000000000000000 0x86 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_udivsi3.o)
......
#include <bwio.h>
#include <mycanvas.h>
int main()
{
bwsetfifo(COM2, OFF);
bwsetspeed(COM2, 115200);
int i = 0;
char display;
for(;i<10;i++){
display=bwgetc(COM2);
bwputc(COM2, display);
MOVE_RIGHT(1);
}
}
#
# Makefile for busy-wait IO tests # Makefile for busy-wait IO tests
# #
XCC = /u/wbcowan/gnuarm-4.0.2/arm-elf/bin/gcc XCC = /u/wbcowan/gnuarm-4.0.2/arm-elf/bin/gcc
...@@ -16,11 +15,14 @@ ASFLAGS = -mcpu=arm920t -mapcs-32 ...@@ -16,11 +15,14 @@ ASFLAGS = -mcpu=arm920t -mapcs-32
ARFLAGS = rcs ARFLAGS = rcs
all: bwio.a all: bwio.a
bwio.s: bwio.c bwio.s: bwio.c
$(XCC) -S $(CFLAGS) bwio.c $(XCC) -S $(CFLAGS) bwio.c
cmd.s: cmd.c
$(XCC) -S $(CFLAGS) cmd.c
mycanvas.s: mycanvas.c mycanvas.s: mycanvas.c
$(XCC) -S $(CFLAGS) mycanvas.c $(XCC) -S $(CFLAGS) mycanvas.c
...@@ -31,6 +33,9 @@ myclock.s: myclock.c ...@@ -31,6 +33,9 @@ myclock.s: myclock.c
bwio.o: bwio.s bwio.o: bwio.s
$(AS) $(ASFLAGS) -o bwio.o bwio.s $(AS) $(ASFLAGS) -o bwio.o bwio.s
cmd.o: cmd.s
$(AS) $(ASFLAGS) -o cmd.o cmd.s
mycanvas.o: mycanvas.s mycanvas.o: mycanvas.s
$(AS) $(ASFLAGS) -o mycanvas.o mycanvas.s $(AS) $(ASFLAGS) -o mycanvas.o mycanvas.s
...@@ -40,14 +45,18 @@ myclock.o: myclock.s ...@@ -40,14 +45,18 @@ myclock.o: myclock.s
bwio.a: bwio.o bwio.a: bwio.o
$(AR) $(ARFLAGS) $@ bwio.o $(AR) $(ARFLAGS) $@ bwio.o
cmd.a: cmd.o
$(AR) $(ARFLAGS) $@ cmd.o
mycanvas.a: mycanvas.o mycanvas.a: mycanvas.o
$(AR) $(ARFLAGS) $@ mycanvas.o $(AR) $(ARFLAGS) $@ mycanvas.o
myclock.a: myclock.o myclock.a: myclock.o
$(AR) $(ARFLAGS) $@ myclock.o $(AR) $(ARFLAGS) $@ myclock.o
install: bwio.a mycanvas.a myclock.a install: bwio.a mycanvas.a myclock.a cmd.a
mv bwio.a ../../lib/libbwio.a mv bwio.a ../../lib/libbwio.a
mv cmd.a ../../lib/libcmd.a
mv mycanvas.a ../../lib/libmycanvas.a mv mycanvas.a ../../lib/libmycanvas.a
mv myclock.a ../../lib/libmyclock.a mv myclock.a ../../lib/libmyclock.a
......
#include <bwio.h>
#include <cmd.h>
#include <mycanvas.h>
int ListenCommand()
{
CURSOR_POS(20,1);
char FirstChar = bwgetc(COM2);
switch(FirstChar){
case 'q':
return CMD_HALT;
default:
break;
}
}
#include <bwio.h>
#include <mycanvas.h> #include <mycanvas.h>
#include <myclock.h>
void DrawClock(int* ClockCount) void DrawLine_H(const char Element, const int Length)
{ {
bwprintf(COM2,"DrawClock, ClockCount %d\n\r", *ClockCount); int i = 0;
unsigned int TenthSecond = (*ClockCount) % 10; for(; i<Length; i++){
bwprintf(COM2,"DrawClock, Tenth %d\n\r", TenthSecond); bwputc(COM2,Element);
unsigned int Second = ((*ClockCount - TenthSecond) % 600)/10; }
bwprintf(COM2,"DrawClock, Second %d\n\r", Second); }
unsigned int Minute = (*ClockCount)/600;
bwprintf(COM2,"%d:%d:%d\n\r",Minute,Second,TenthSecond); void DrawLine_V(const char Element, const int Length)
{
int i = 0;
for(; i<Length; i++){
bwputc(COM2,Element);
MOVE_LEFT(1);
MOVE_DOWN(1);
}
}
void DrawClock(Clock *MyClock){
if(MyClock->bChanged !=0){
unsigned int Count = MyClock->ClockCount;
unsigned int Tenth = Count % 10;
unsigned int Seconds = (Count % 100 )/ 10;
unsigned int Tens = (Count % 600) /100;
unsigned int Minute = Count/600;
CURSOR_POS(10, 66);
bwprintf(COM2,"%d:%d%d:%d\n\r",Minute,Tens,Seconds,Tenth);
}
}
void DrawPanel()
{
CURSOR_POS(1,1);
//DrawLine_H('#',80);
CURSOR_POS(2,60);
DrawLine_V('|', 20);
CURSOR_POS(32,1);
//DrawLine_H('#', 79);
CURSOR_POS(2,80);
DrawLine_V('#', 25);
CURSOR_POS(2,1);
DrawLine_V('#', 25);
CURSOR_POS(23,3);
DrawLine_V('>', 3);
CURSOR_POS(23,4);
DrawLine_V('>', 3);
CURSOR_POS(26,1);
//DrawLine_H('#', 79);
} }
#include <bwio.h>
#include <myclock.h> #include <myclock.h>
#include <ts7200.h> #include <ts7200.h>
void InitClockCount(Clock *MyClock)
void InitClockCount(int* ClockCount, int* LastTimerValue)
{ {
*ClockCount = 0; MyClock->ClockCount = 0;
*LastTimerValue = CLOCK_LOAD_VALUE; MyClock->LastTimerValue = CLOCK_LOAD_VALUE;
int* Clock3LoadRegister = (int *) TIMER3_BASE; unsigned int* Clock3LoadRegister = (unsigned int *) (TIMER3_BASE + LDR_OFFSET);
int* Clock3ControlRegister = (int *) TIMER3_BASE + CRTL_OFFSET; unsigned int* Clock3ControlRegister = (unsigned int *) (TIMER3_BASE + CRTL_OFFSET);
// int ClearMode = MODE_MASK | CLKSEL_MASK; unsigned int ClockConfig = MODE_MASK | CLKSEL_MASK;
// clear clock
// *Clock3ControlRegister = ClearMode;
// set interval // set interval
*Clock3LoadRegister = CLOCK_LOAD_VALUE; *Clock3LoadRegister = CLOCK_LOAD_VALUE;
// enable clock // enable clock
*Clock3ControlRegister = ENABLE_MASK; *Clock3ControlRegister = ENABLE_MASK | ClockConfig;
bwprintf(COM2,"InitClock, ClockCount %d, LastTimerValue: %d\n\r",*ClockCount, *LastTimerValue);
} }
void UpdateClock(int* ClockCount, int* LastTimerValue) void UpdateClock(Clock *MyClock)
{ {
int* TimerValueRegister = (int *) TIMER3_BASE + VAL_OFFSET; unsigned int* TimerValueRegister = (unsigned int *) (TIMER3_BASE + VAL_OFFSET);
int CurrentTimerValue = *TimerValueRegister; unsigned int CurrentTimerValue = *TimerValueRegister;
bwprintf(COM2, "UpdateClock, LastTimerVlaue: %d, ClockCount:%d\n\r",*LastTimerValue,*ClockCount);
if(CurrentTimerValue >= *LastTimerValue) ClockCount++; if(CurrentTimerValue > MyClock->LastTimerValue){
*LastTimerValue = CurrentTimerValue; MyClock->ClockCount = MyClock->ClockCount + 1;
MyClock->bChanged = 1;
} else {
MyClock->bChanged = 0;
}
MyClock->LastTimerValue = CurrentTimerValue;
} }
File added
#include <stdio.h>
#define ESC 27
#define CSI_LEFT printf("%c[1D",27)
#define CLEAR_SCREEN printf("%c[2J",27)
#define pos(row,col) printf("%c[%d;%dH",ESC,row,col)
void DrawLine(char elem, int len)
{
for(int i = 0; i<len; i++){
printf("%c",elem);
}
}
void DrawLine_V(char elem, int len)
{
for(int i = 0; i<len; i++){
printf("%c",elem);
printf("%c[1B",ESC);
CSI_LEFT;
}
}
int main()
{
CLEAR_SCREEN;
pos(1,1);
DrawLine('#',80);
pos(2,60);
DrawLine_V('|', 30);
pos(32,1);
DrawLine('#', 79);
pos(2,80);
DrawLine_V('#', 35);
pos(2,1);
DrawLine_V('#', 35);
pos(33,3);
DrawLine_V('>', 3);
pos(33,4);
DrawLine_V('>', 3);
pos(36,1);
DrawLine('#', 79);
printf("\n");
while(1){
pos(10, 66);
printf("00:00:0");
}
return 0;
}
#include <bwio.h> #include <bwio.h>
#include <cmd.h>
#include <error.h> #include <error.h>
#include <mycanvas.h> #include <mycanvas.h>
#include <myclock.h> #include <myclock.h>
int initialize(int* ClockCount, int* LastTimerValue) int initialize(Clock* MyClock)
{ {
if(bwsetfifo(COM2, OFF)) return ERR_INIT_IO; if(bwsetfifo(COM2, OFF)) return ERR_INIT_IO;
if(bwsetspeed(COM1, 2400)) return ERR_INIT_IO; if(bwsetspeed(COM1, 2400)) return ERR_INIT_IO;
if(bwsetspeed(COM2, 115200)) return ERR_INIT_IO; if(bwsetspeed(COM2, 115200)) return ERR_INIT_IO;
InitClockCount(ClockCount, LastTimerValue); InitClockCount(MyClock);
return 0; return 0;
} }
int runloop(int* ClockCount, int* LastTimerValue) int runloop(Clock* MyClock)
{ {
while(1){ while(1){
UpdateClock(ClockCount, LastTimerValue); UpdateClock(MyClock);
bwprintf(COM2, "ClockCount %d\n\r", *ClockCount); DrawClock(MyClock);
DrawClock(ClockCount); if(ListenCommand() == CMD_HALT) break;
} }
return 0; return 0;
} }
int main(){ int main(){
unsigned int ClockCount, LastTimerValue; volatile Clock MyClock = {0,0,0};
unsigned int InitCode = initialize(&ClockCount, &LastTimerValue); unsigned int InitCode = initialize(&MyClock);
if(InitCode) return InitCode; if(InitCode) return InitCode;
return runloop(&ClockCount, &LastTimerValue); CLEAR_SCREEN;
// DrawPanel();
return runloop(&MyClock);
} }
#! /bin/bash #! /bin/bash
mv $1 /u/cs452/tftp/ARM/b26feng/ cp $1 /u/cs452/tftp/ARM/b26feng/
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment