Browse Source

clkhandler sleep queue like original Xinu

master
Rafael Zurita 5 years ago
parent
commit
2d1a2e96f0
  1. 5
      include/prototypes.h
  2. 2
      include/queue.h
  3. 33
      system/clkhandler.c
  4. 2
      system/insertd.c
  5. 8
      system/sleep.c

5
include/prototypes.h

@ -162,7 +162,7 @@ extern status insert(pid32, qid16, char);
/* in file insertd.c */
// extern status insertd(pid32, qid16, int32);
extern status insertd(pid32, qid16, char);
extern status insertd(pid32, qid16, uint16);
/* in file intr.S */
extern intmask disable(void);
@ -514,8 +514,7 @@ extern syscall signal(sid32);
extern syscall signaln(sid32, int32);
/* in file sleep.c */
// extern syscall sleepms(int32);
extern syscall sleep100ms(int32); /* avr atmega328p specific */
extern syscall sleepms(int32);
extern syscall sleep(int32);
/* in file spicontrol.c */

2
include/queue.h

@ -13,7 +13,7 @@
#define MINKEY 0x80000000 /* Min key that can be stored in queue */
struct qentry { /* One per process plus two per list */
char qkey; /* Key on which the queue is ordered */
uint16 qkey; /* Key on which the queue is ordered */
// int32 qkey; /* Key on which the queue is ordered */
qid16 qnext; /* Index of next process or tail */
qid16 qprev; /* Index of previous process or head */

33
system/clkhandler.c

@ -32,32 +32,21 @@ ISR(TIMER0_COMPA_vect)
count1000 = 0;
}
/* check if sleep queue is empty every 100ms */
if(!isempty(sleepq)) {
/* sleepq nonempty, decrement the key of */
/* topmost process on sleepq */
if ((count1000 % 100) == 0) /* every 100ms */
if(!isempty(sleepq)) {
/* sleepq nonempty, decrement the key of */
/* topmost process on sleepq */
if((--queuetab[firstid(sleepq)].qkey) == 0) {
if((--queuetab[firstid(sleepq)].qkey) == 0) {
wakeup();
}
wakeup();
}
}
/* our MCU is slow (16Mhz), so we do resched/preemption every 300ms */
avr_ticks ++;
if (avr_ticks > 300) {
// if (avr_ticks > 10) {
// if (avr_ticks > 100) {
avr_ticks=0;
/* Decrement the preemption counter */
/* Reschedule if necessary */
if((--preempt) == 0) {
preempt = QUANTUM;
resched();
}
/* Decrement the preemption counter */
/* Reschedule if necessary */
if((--preempt) == 0) {
preempt = QUANTUM;
resched();
}
}

2
system/insertd.c

@ -9,7 +9,7 @@
status insertd( /* Assumes interrupts disabled */
pid32 pid, /* ID of process to insert */
qid16 q, /* ID of queue to use */
char key /* Delay from "now" (in ms. * 100) */
uint16 key /* Delay from "now" (in ms.) */
)
{
int32 next; /* Runs through the delta list */

8
system/sleep.c

@ -15,17 +15,17 @@ syscall sleep(
if ( (delay < 0) || (delay > MAXSECONDS) ) {
return SYSERR;
}
sleep100ms(10*delay);
sleepms(1000*delay);
return OK;
}
/*------------------------------------------------------------------------
* sleep100ms - Delay the calling process n x 100 milliseconds
* for example: 1 second = sleep100ms(10)
* sleepms - Delay the calling process n x 1000 milliseconds
* for example: 1 second = sleepms(1000)
* avr atmega328p specific
*------------------------------------------------------------------------
*/
syscall sleep100ms(
syscall sleepms(
int32 delay /* Time to delay in msec. */
)
{

Loading…
Cancel
Save