sched: Introduce sched_wake_tasks() function to wake up tasks

Add function to indicate when tasks need to be run.  This will allow
the scheduler code to know if there are any tasks that need to be
processed.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
Kevin O'Connor 2017-08-07 11:33:31 -04:00
parent e9d2ec7c41
commit a9982beacf
10 changed files with 74 additions and 10 deletions

View file

@ -65,6 +65,8 @@ DECL_INIT(serial_init);
ISR(USART0_RX_vect)
{
uint8_t data = UDR0;
if (data == MESSAGE_SYNC)
sched_wake_tasks();
if (receive_pos >= sizeof(receive_buf))
// Serial overflow - ignore it as crc error will force retransmit
return;
@ -104,6 +106,7 @@ console_pop_input(uint8_t len)
memmove(&receive_buf[copied], &receive_buf[copied + len]
, needcopy - copied);
copied = needcopy;
sched_wake_tasks();
}
irqstatus_t flag = irq_save();
if (rpos != readb(&receive_pos)) {

View file

@ -42,8 +42,10 @@ static void
console_pop_input(uint8_t len)
{
uint8_t needcopy = receive_pos - len;
if (needcopy)
if (needcopy) {
memmove(receive_buf, &receive_buf[len], needcopy);
sched_wake_tasks();
}
receive_pos = needcopy;
}

View file

@ -11,7 +11,7 @@
#include "board/misc.h" // crc16_ccitt
#include "board/pgm.h" // READP
#include "command.h" // output_P
#include "sched.h" // DECL_TASK
#include "sched.h" // sched_is_shutdown
static uint8_t next_sequence = MESSAGE_DEST;

View file

@ -85,7 +85,10 @@ timer_kick(void)
static void
_irq_poll(void)
{
if (CT_INTC.SECR0 & (1 << IEP_EVENT)) {
uint32_t secr0 = CT_INTC.SECR0;
if (secr0 & (1 << KICK_PRU1_EVENT))
sched_wake_tasks();
if (secr0 & (1 << IEP_EVENT)) {
CT_IEP.TMR_CMP_STS = 0xff;
uint32_t next = timer_dispatch_many();
timer_set(next);
@ -121,7 +124,6 @@ console_task(void)
const struct command_parser *cp = SHARED_MEM->next_command;
if (!cp)
return;
barrier();
if (sched_is_shutdown() && !(cp->flags & HF_IN_SHUTDOWN)) {
sched_report_shutdown();

View file

@ -56,6 +56,8 @@ UART_Handler(void)
uint32_t status = UART->UART_SR;
if (status & UART_SR_RXRDY) {
uint8_t data = UART->UART_RHR;
if (data == MESSAGE_SYNC)
sched_wake_tasks();
if (receive_pos >= sizeof(receive_buf))
// Serial overflow - ignore it as crc error will force retransmit
return;
@ -94,6 +96,7 @@ console_pop_input(uint32_t len)
memmove(&receive_buf[copied], &receive_buf[copied + len]
, needcopy - copied);
copied = needcopy;
sched_wake_tasks();
}
irqstatus_t flag = irq_save();
if (rpos != readl(&receive_pos)) {

View file

@ -28,6 +28,9 @@ static struct timer sentinel_timer, deleted_timer;
static uint_fast8_t
periodic_event(struct timer *t)
{
// Make sure the stats task runs periodically
sched_wake_tasks();
// Reschedule timer
periodic_timer.waketime += timer_from_us(100000);
sentinel_timer.waketime = periodic_timer.waketime + 0x80000000;
return SF_RESCHEDULE;
@ -177,10 +180,17 @@ sched_timer_reset(void)
* Task waking
****************************************************************/
// Note that at least one task is ready to run
void
sched_wake_tasks(void)
{
}
// Note that a task is ready to run
void
sched_wake_task(struct task_wake *w)
{
sched_wake_tasks();
writeb(&w->wake, 1);
}

View file

@ -29,6 +29,7 @@ struct task_wake {
void sched_add_timer(struct timer*);
void sched_del_timer(struct timer *del);
unsigned int sched_timer_dispatch(void);
void sched_wake_tasks(void);
void sched_wake_task(struct task_wake *w);
uint8_t sched_check_wake(struct task_wake *w);
uint8_t sched_is_shutdown(void);