123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- #include "rtos.h"
- #include "stm8s_it.h"
- #define TIM4_PERIOD (uint8_t)124
- static __IO task TaskArray[MAX_TASKS];
- static __IO uint8_t arrayTail;
- static __IO uint16_t TimingDelay;
- inline void RTOS_Init()
- {
-
-
- TIM4_TimeBaseInit(TIM4_PRESCALER_128, TIM4_PERIOD);
-
- TIM4_ClearFlag(TIM4_FLAG_UPDATE);
-
- TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
-
- enableInterrupts();
-
- TIM4_Cmd(ENABLE);
-
- arrayTail = 0;
- }
- void RTOS_SetTask (void (*taskFunc)(void), uint16_t taskDelay, uint16_t taskPeriod)
- {
- uint8_t i;
- if(!taskFunc) return;
- for(i = 0; i < arrayTail; i++)
- {
- if(TaskArray[i].pFunc == taskFunc)
- {
- DISABLE_INTERRUPT;
- TaskArray[i].delay = taskDelay;
- TaskArray[i].period = taskPeriod;
- TaskArray[i].run = 0;
- ENABLE_INTERRUPT;
- return;
- }
- }
- if (arrayTail < MAX_TASKS)
- {
- DISABLE_INTERRUPT;
- TaskArray[arrayTail].pFunc = taskFunc;
- TaskArray[arrayTail].delay = taskDelay;
- TaskArray[arrayTail].period = taskPeriod;
- TaskArray[arrayTail].run = 0;
- arrayTail++;
- ENABLE_INTERRUPT;
- }
- }
- void RTOS_DeleteTask (void (*taskFunc)(void))
- {
- uint8_t i;
- for (i=0; i<arrayTail; i++)
- {
- if(TaskArray[i].pFunc == taskFunc)
- {
- DISABLE_INTERRUPT;
- if(i != (arrayTail - 1))
- {
- TaskArray[i] = TaskArray[arrayTail - 1];
- }
- arrayTail--;
- ENABLE_INTERRUPT;
- return;
- }
- }
- }
- void RTOS_DispatchTask(void)
- {
- uint8_t i;
- void (*function) (void);
- for (i=0; i<arrayTail; i++)
- {
- if (TaskArray[i].run == 1)
- {
- function = TaskArray[i].pFunc;
-
- if(TaskArray[i].period == 0)
- {
- RTOS_DeleteTask(TaskArray[i].pFunc);
- } else {
- TaskArray[i].run = 0;
- if(!TaskArray[i].delay)
- {
- TaskArray[i].delay = TaskArray[i].period-1;
- }
- }
- (*function)();
- }
- }
- }
- void Delay(__IO uint16_t nTime)
- {
- TimingDelay = nTime;
- while (TimingDelay != 0) {
-
- wfi();
- }
- }
- INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler,23)
- {
-
-
- TIM4->SR1 = (uint8_t)(~(uint8_t)TIM4_IT_UPDATE);
-
- if (TimingDelay > 0) {
- TimingDelay --;
- }
-
- uint8_t i;
- for (i=0; i<arrayTail; i++) {
- if (TaskArray[i].delay == 0) {
- TaskArray[i].run = 1;
- } else {
- TaskArray[i].delay--;
- }
- }
- }
|