You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
4.4 KiB
C
119 lines
4.4 KiB
C
/* Blinky/Button with uC/OS-II RTOS */
|
|
#include "ucos_ii.h" /* uC/OS-II API, port and compile-time configuration */
|
|
#include "bsp.h"
|
|
|
|
static char const this_module[] = "main"; /* this module name for BSP_ASSERT() */
|
|
|
|
/* The Blinky thread =========================================================*/
|
|
OS_STK stack_blinky[100]; /* task stack */
|
|
|
|
enum { INITIAL_BLINK_TIME = (OS_TICKS_PER_SEC / 4) };
|
|
|
|
/* data shared between tasks */
|
|
INT32U volatile shared_blink_time = INITIAL_BLINK_TIME;
|
|
OS_EVENT *shared_blink_time_mutex;
|
|
|
|
void main_blinky(void *pdata) { /* task function */
|
|
(void)pdata; /* unused parameter(s) */
|
|
|
|
while (1) { /* endless "superloop" */
|
|
INT8U err;
|
|
INT32U bt; /* local copy of shared_blink_time */
|
|
|
|
OSMutexPend(shared_blink_time_mutex, 0, &err); /* mutual exclusion */
|
|
BSP_ASSERT(err == 0);
|
|
bt = shared_blink_time;
|
|
OSMutexPost(shared_blink_time_mutex); /* mutual exclusion */
|
|
|
|
BSP_ledGreenOn();
|
|
OSTimeDly(bt); /* BLOCKING! */
|
|
BSP_ledGreenOff();
|
|
OSTimeDly(bt * 3U); /* BLOCKING! */
|
|
}
|
|
}
|
|
|
|
/* The Button thread =========================================================*/
|
|
OS_STK stack_button[100]; /* task stack */
|
|
|
|
void main_button(void *pdata) { /* task function */
|
|
(void)pdata; /* unused parameter(s) */
|
|
|
|
while (1) { /* endless "superloop" */
|
|
INT8U err; /* uC/OS-II error status */
|
|
|
|
/* wait on the button-press semaphore (BLOCK indefinitely) */
|
|
OSSemPend(BSP_semaPress, 0, &err); /* BLOCKING! */
|
|
BSP_ASSERT(err == 0);
|
|
BSP_ledBlueOn();
|
|
|
|
/* update the blink time for the 'blink' thread */
|
|
OSMutexPend(shared_blink_time_mutex, 0, &err); /* mutual exclusion */
|
|
BSP_ASSERT(err == 0);
|
|
shared_blink_time >>= 1; /* shorten the blink time by factor of 2 */
|
|
if (shared_blink_time == 0U) {
|
|
shared_blink_time = INITIAL_BLINK_TIME;
|
|
}
|
|
OSMutexPost(shared_blink_time_mutex); /* mutual exclusion */
|
|
|
|
/* wait on the button-release semaphore (BLOCK indefinitely) */
|
|
OSSemPend(BSP_semaRelease, 0, &err); /* BLOCKING! */
|
|
BSP_ledBlueOff();
|
|
}
|
|
}
|
|
|
|
OS_EVENT *BSP_semaPress; /* global semaphore handle */
|
|
OS_EVENT *BSP_semaRelease; /* global semaphore handle */
|
|
|
|
/* the main function =========================================================*/
|
|
int main() {
|
|
INT8U err;
|
|
|
|
BSP_init(); /* initialize the BSP */
|
|
OSInit(); /* initialize uC/OS-II */
|
|
|
|
/* initialize the RTOS objects before using them */
|
|
BSP_semaPress = OSSemCreate(0);
|
|
BSP_ASSERT(BSP_semaPress);
|
|
BSP_semaRelease = OSSemCreate(0);
|
|
BSP_ASSERT(BSP_semaRelease);
|
|
shared_blink_time_mutex = OSMutexCreate(OS_LOWEST_PRIO - 5, &err);
|
|
BSP_ASSERT(err == 0);
|
|
|
|
/* create uC/OS-II task, see NOTE1 */
|
|
err = OSTaskCreateExt(&main_blinky, /* the task function */
|
|
(void *)0, /* the 'pdata' parameter (not used) */
|
|
&stack_blinky[(sizeof(stack_blinky) / sizeof(OS_STK)) - 1], /* ptos */
|
|
OS_LOWEST_PRIO - 4, /* uC/OS-II task priority */
|
|
OS_LOWEST_PRIO - 4, /* unique priority is used as the task ID */
|
|
stack_blinky, /* pbos */
|
|
(INT32U)(sizeof(stack_blinky)/sizeof(OS_STK)),/* stack depth */
|
|
(void *)0, /* pext */
|
|
(INT16U)0); /* task options */
|
|
BSP_ASSERT(err == 0);
|
|
|
|
/* create uC/OS-II task, see NOTE1 */
|
|
err = OSTaskCreateExt(&main_button, /* the task function */
|
|
(void *)0, /* the 'pdata' parameter (not used) */
|
|
&stack_button[(sizeof(stack_button) / sizeof(OS_STK)) - 1], /* ptos */
|
|
OS_LOWEST_PRIO - 3, /* uC/OS-II task priority */
|
|
OS_LOWEST_PRIO - 3, /* unique priority is used as the task ID */
|
|
stack_button, /* pbos */
|
|
(INT32U)(sizeof(stack_button)/sizeof(OS_STK)),/* stack depth */
|
|
(void *)0, /* pext */
|
|
(INT16U)0); /* task options */
|
|
BSP_ASSERT(err == 0);
|
|
|
|
BSP_start(); /* configure and start the interrupts */
|
|
|
|
OSStart(); /* start the uC/OS-II scheduler... */
|
|
return 0; /* NOTE: the scheduler does NOT return */
|
|
}
|
|
|
|
/*******************************************************************************
|
|
* NOTE1:
|
|
* The call to uC/OS-II API OSTaskCreateExt() assumes that the pointer to the
|
|
* top-of-stack (ptos) is at the end of the provided stack memory. This is
|
|
* correct only for CPUs with downward-growing stack, but must be changed for
|
|
* CPUs with upward-growing stack.
|
|
*/
|