summaryrefslogtreecommitdiff
path: root/rs422lib/sysctl.c
diff options
context:
space:
mode:
authorJoe Zhao <ztuowen@gmail.com>2014-05-16 13:48:41 +0800
committerJoe Zhao <ztuowen@gmail.com>2014-05-16 13:48:41 +0800
commit01a12fdad10b5995495e1a4236fdfb1a583979ab (patch)
tree44010320ae31d4e967871a8e9b1231134b6ecd45 /rs422lib/sysctl.c
downloadrsbus-01a12fdad10b5995495e1a4236fdfb1a583979ab.tar.gz
rsbus-01a12fdad10b5995495e1a4236fdfb1a583979ab.tar.bz2
rsbus-01a12fdad10b5995495e1a4236fdfb1a583979ab.zip
First Commit
Diffstat (limited to 'rs422lib/sysctl.c')
-rw-r--r--rs422lib/sysctl.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/rs422lib/sysctl.c b/rs422lib/sysctl.c
new file mode 100644
index 0000000..fbacb9c
--- /dev/null
+++ b/rs422lib/sysctl.c
@@ -0,0 +1,87 @@
+/*
+ * sysctl.c
+ *
+ * Created on: 2014-4-26
+ * Author: Tuowen
+ */
+
+#include<msp430g2553.h>
+#include"sysctl.h"
+
+syshdlr sysarr[8];
+
+volatile unsigned char syscall=0;
+
+void sysctl_void()
+{
+ // This is the default routine
+ // I don't want some monkey just come and call some random places in the text!!!!!
+}
+
+void sysroutine()
+{
+ if (syscall>0)
+ switch ((syscall & (-syscall)))
+ {
+ case SYS_BIT7:
+ syscall=syscall&(~SYS_BIT7);
+ sysarr[7]();
+ break;
+ case SYS_BIT6:
+ syscall=syscall&(~SYS_BIT6);
+ sysarr[6]();
+ break;
+ case SYS_BIT5:
+ syscall=syscall&(~SYS_BIT5);
+ sysarr[5]();
+ break;
+ case SYS_BIT4:
+ syscall=syscall&(~SYS_BIT4);
+ sysarr[4]();
+ break;
+ case SYS_BIT3:
+ syscall=syscall&(~SYS_BIT3);
+ sysarr[3]();
+ break;
+ case SYS_BIT2:
+ syscall=syscall&(~SYS_BIT2);
+ sysarr[2]();
+ break;
+ case SYS_BIT1:
+ syscall=syscall&(~SYS_BIT1);
+ sysarr[1]();
+ break;
+ case SYS_BIT0:
+ syscall=syscall&(~SYS_BIT0);
+ sysarr[0]();
+ break;
+ }
+ else
+ _BIS_SR(CPUOFF);
+}
+
+inline int sys_b2i(int bit)
+{
+ int i=0;
+ while (bit>1){bit>>=1;++i;}
+ return i;
+}
+
+void sysctl_reghdlr(unsigned int bit,syshdlr rot)
+{
+ bit=sys_b2i(bit);
+ sysarr[bit]=rot;
+}
+
+void sysctl_rmhdlr(unsigned int bit)
+{
+ bit=sys_b2i(bit);
+ sysarr[bit]=&sysctl_void;
+}
+
+void sysctl_init()
+{
+ unsigned int i;
+ for (i=0;i<8;++i)
+ sysarr[i]=&sysctl_void;
+}