⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os.c

📁 adhoc汇聚节点程序源代码(点对多点)——for atmega128
💻 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 + -