📄 os.c
字号:
/*
****************************************************************************
* 宁波市科技园区创业大厦六楼
* 宁波中科集成电路设计中心 版权所有 Copyright 2005
*
*文件名: os.c
*程序员:
*主要内容:内核调度
*完成日期:2005.3.25
****************************************************************************
*/
#include "os.h"
#include "fun.h"
#include "adc.h"
#include "testBase.h"
typedef struct SchedUnit{
void (*tp)(void);
} OSSchedUnit;
enum {
OSH_MAX_TASKS = 8,
OSH_TASK_BITMASK = OSH_MAX_TASKS - 1
};
OSSchedUnit OSH_queue[OSH_MAX_TASKS];
volatile uint8_t OSH_sched_full;
volatile uint8_t OSH_sched_free;
void OSH_SET_PIN_DIRECTIONS(void )
{
OSH_MAKE_RED_LED_OUTPUT();
OSH_MAKE_YELLOW_LED_OUTPUT();
OSH_MAKE_GREEN_LED_OUTPUT();
OSH_MAKE_CC_CHP_OUT_INPUT();
OSH_MAKE_PW7_OUTPUT();
OSH_MAKE_PW6_OUTPUT();
OSH_MAKE_PW5_OUTPUT();
OSH_MAKE_PW4_OUTPUT();
OSH_MAKE_PW3_OUTPUT();
OSH_MAKE_PW2_OUTPUT();
OSH_MAKE_PW1_OUTPUT();
OSH_MAKE_PW0_OUTPUT();
OSH_MAKE_CC_PALE_OUTPUT();
OSH_MAKE_CC_PDATA_OUTPUT();
OSH_MAKE_CC_PCLK_OUTPUT();
OSH_MAKE_MISO_INPUT();
OSH_MAKE_SPI_OC1C_INPUT();
OSH_MAKE_SERIAL_ID_INPUT();
OSH_CLR_SERIAL_ID_PIN();
OSH_MAKE_FLASH_SELECT_OUTPUT();
OSH_MAKE_FLASH_OUT_OUTPUT();
OSH_MAKE_FLASH_CLK_OUTPUT();
OSH_SET_FLASH_SELECT_PIN();
OSH_SET_RED_LED_PIN();
OSH_SET_YELLOW_LED_PIN();
OSH_SET_GREEN_LED_PIN();
}
result_t MainHardwareInit(void)
{
OSH_SET_PIN_DIRECTIONS();
return SUCCESS;
}
void OSSchedInit(void )
{
OSH_sched_free = 0;
OSH_sched_full = 0;
}
void OSH_uwait(int u_sec)
{
while (u_sec > 0) {
__asm volatile ("nop");
__asm volatile ("nop");
__asm volatile ("nop");
__asm volatile ("nop");
__asm volatile ("nop");
__asm volatile ("nop");
__asm volatile ("nop");
__asm volatile ("nop");
u_sec--;
}
}
result_t MainStdControlInit(void)
{
unsigned char result;
result = testBaseInit();
return result;
}
result_t MainStdControlStart(void)
{
unsigned char result;
result = 1;
return result;
}
void EnableInterrupt(void)
{
__asm volatile ("sei");}
void OSH_wait(void)
{
__asm volatile ("nop");
__asm volatile ("nop");}
void OSH_sleep(void)
{
* (volatile unsigned char *)(0x35 + 0x20) |= 1 << 5;
__asm volatile ("sleep");}
void AtomicEnd(uint8_t oldSreg)
{
* (volatile unsigned char *)(0x3F + 0x20) = oldSreg;
}
uint8_t AtomicStart(void )
{
uint8_t result = * (volatile unsigned char *)(0x3F + 0x20);
__asm volatile ("cli");
return result;
}
bool OSHRunNextTask(void)
{
uint8_t fInterruptFlags;
uint8_t old_full;
void (*func)(void );
if (OSH_sched_full == OSH_sched_free) {
return 0;
}
else {
fInterruptFlags = AtomicStart();
old_full = OSH_sched_full;
OSH_sched_full++;
OSH_sched_full &= OSH_TASK_BITMASK;
func = OSH_queue[(int )old_full].tp;
OSH_queue[(int )old_full].tp = 0;
AtomicEnd(fInterruptFlags);
func();
return 1;
}
}
void OSHRunTask(void)
{
while (OSHRunNextTask())
;
OSH_sleep();
OSH_wait();
}
bool OSPostTask(void (*tp)(void))
{
uint8_t fInterruptFlags;
uint8_t tmp;
fInterruptFlags = AtomicStart();
tmp = OSH_sched_free;
OSH_sched_free++;
OSH_sched_free &= OSH_TASK_BITMASK;
if (OSH_sched_free != OSH_sched_full) {
AtomicEnd(fInterruptFlags);
OSH_queue[tmp].tp = tp;
return TRUE;
}
else {
OSH_sched_free = tmp;
AtomicEnd(fInterruptFlags);
return FALSE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -