Eric Ebert
/
CoOS
CoOS Demonstrator adapted to mbed Hardware.
Diff: main.cpp
- Revision:
- 0:57690853989a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Dec 03 19:45:30 2010 +0000 @@ -0,0 +1,190 @@ +#include "mbed.h" +#include <CoOS.h> + +Serial pc(USBTX, USBRX); + +/*---------------------------------- Define ---------------------------------*/ +#define STK_SIZE 128 /*!< Stack size. */ +#define INIT_TASK_PRIO 11 /*!< Priority of "init_task" task. */ +#define A_TASK_PRIO 10 /*!< Priority of "A" task. */ +#define B_TASK_PRIO 10 /*!< Priority of "B" task. */ +#define CLK_TASK_PRIO 10 /*!< Priority of "clock" task. */ + +/*---------------------------------- Variable Define -------------------------*/ +OS_STK init_task_stk[STK_SIZE]; /*!< The stack of "init_task" task. */ +OS_STK a_task_stk[STK_SIZE]; /*!< The stack of "a" task. */ +OS_STK b_task_stk[STK_SIZE]; /*!< The stack of "b" task. */ +OS_STK clk_task_stk[STK_SIZE]; /*!< The stack of "clcok" task. */ + +OS_MutexID mut_LED; /*!< Mutex id related to LED. */ + +OS_FlagID a_flg; +OS_FlagID b_flg; +U8 errInfo[32]; /*!< Save error code. */ + + +DigitalOut myled(LED1); + +/** + ******************************************************************************* + * @brief Switch on LED + * @param[in] None + * @param[out] None + * @retval None + * @par Description + * @details This function use to Switch on specify led in LCD. + ******************************************************************************* + */ +void LED_On () +{ + CoEnterMutexSection(mut_LED); + myled =1; + CoLeaveMutexSection(mut_LED); +} + +/** + ******************************************************************************* + * @brief Switch off LED + * @param[in] None + * @param[out] None + * @retval None + * @par Description + * @details This function use to Switch off specify led in LCD. + ******************************************************************************* + */ +void LED_Off () { + + CoEnterMutexSection(mut_LED); + myled = 0; + CoLeaveMutexSection(mut_LED); +} + + +/** + ******************************************************************************* + * @brief Function 'signal_func' called from multiple tasks + * @param[in] None + * @param[out] None + * @retval None + * @par Description + * @details This function use to Set flag for multiple tasks. + ******************************************************************************* + */ +void signal_func (const char* fromString) +{ + + pc.printf(fromString); + CoSetFlag(b_flg); + CoTickDelay(50); + CoSetFlag(b_flg); + CoTickDelay(50); + CoSetFlag(a_flg); + CoTickDelay(50); +} + + + +/** + ******************************************************************************* + * @brief Task 1 'phaseA': Phase A output + * @param[in] pdata A pointer to parameter passed to task. + * @param[out] None + * @retval None + ******************************************************************************* + */ +void taskA (void *pdata) { + for (;;) { + CoWaitForSingleFlag(a_flg,0); + LED_On(); + signal_func("\r\nSignal from Task A"); /*!< call common signal function */ + LED_Off(); + } +} + + +/** + ******************************************************************************* + * @brief Task 2 'phaseB': Phase B output + * @param[in] pdata A pointer to parameter passed to task. + * @param[out] None + * @retval None + ******************************************************************************* + */ +void taskB (void *pdata) { + for (;;) { + CoWaitForSingleFlag(a_flg,0); + LED_On (); + signal_func("\r\nSignal from Task B"); /*!< call common signal function */ + LED_Off(); + } +} + + + +/** + ******************************************************************************* + * @brief Task 5 'clock': Signal Clock + * @param[in] pdata A pointer to parameter passed to task. + * @param[out] None + * @retval None + ******************************************************************************* + */ +void clock (void *pdata) { + for (;;) { + CoWaitForSingleFlag(b_flg,0); + LED_On (); + CoTickDelay(10); + LED_Off(); + } +} + + +/** + ******************************************************************************* + * @brief "init_task" task code + * @param[in] pdata A pointer to parameter passed to task. + * @param[out] None + * @retval None + * @par Description + * @details This task use to create other tasks, all mutexs and flags,and so on. + ******************************************************************************* + */ +void init_task (void *pdata) +{ + pdata = pdata; + + mut_LED = CoCreateMutex(); + a_flg = CoCreateFlag(TRUE,0); + b_flg = CoCreateFlag(TRUE,0); + + CoCreateTask(taskA,0,A_TASK_PRIO,&a_task_stk[STK_SIZE-1],STK_SIZE); + CoCreateTask(taskB,0,B_TASK_PRIO,&b_task_stk[STK_SIZE-1],STK_SIZE); + CoCreateTask(clock,0,CLK_TASK_PRIO,&clk_task_stk[STK_SIZE-1],STK_SIZE); + CoSetFlag(a_flg); + CoExitTask(); /*!< Delete "init_task" task. */ +} + + +/** + ******************************************************************************* + * @brief main function + * @param[in] None + * @param[out] None + * @retval None + ******************************************************************************* + */ +int main() +{ + //SystemInit(); /*!< Initialize the MCU clocks */ + + pc.printf ("\r\n"); + pc.printf ("\r\nCooCox RTOS Demo\n"); + CoInitOS(); /*!< Initial CooCox RTOS. */ + pc.printf ("\r\n CoInitOS done."); + CoCreateTask( init_task,0,INIT_TASK_PRIO,&init_task_stk[STK_SIZE-1],STK_SIZE); + pc.printf ("\r\n CoCreateTask init_task done."); + CoStartOS(); + pc.printf ("\r\n CoStartOS done."); + + while (1); +} \ No newline at end of file