本帖最后由 ddllxxrr 于 2025-7-28 05:43 编辑
最近我研究一个不用操作系统然后可以实现操作系统一样的功能的最简系统。研究的结果还是得用操作系统。
但碰到一个简单的只要时间片运行的还是可以用一下基于时间触发的操作系统的。
该系统占资源极少。
我的方法是用TICK计数,计100个任务一运行,然后200个任务2运行,然后300个任务3运行。
任务一:点LED
任务二:点LED
任务三:打印一个字符串
其核心是定时器中断时记数。然后主程序根据旗标来执行。
主函数:
while (1)
{
//Delay();
if(tick > 100)
{
if( task1flag==0)
{
BOARD_LED_Toggle(LED2);
BOARD_LED_Off(LED3);
task1flag = 1;
}
}
if(tick > 200)
{
if(task2flag==0)
{
BOARD_LED_Toggle(LED3);
BOARD_LED_Off(LED2);
task2flag = 1;
}
}
if(tick > 300)
{
if(task3flag==0)
{
task3flag = 1;
printf("Hello world!!!!!\n\r");
}
}
if(tick > 400)
{
tick = 0;
task1flag=0;
task2flag=0;
task3flag=0;
}
// for(i = 0; i < sizeof(txBuf); i++)
// {
// while(USART_ReadStatusFlag(USART1, USART_FLAG_TXBE) == RESET);
// USART_TxData(USART1, txBuf[i]);
// }
// //BOARD_LED_Toggle(LED2);
}
初始化代码:
uint8_t i;
USART_Config_T USART_ConfigStruct;
BOARD_LED_Config(LED2);
BOARD_LED_Config(LED3);
USART_ConfigStruct.baudRate = 115200;
USART_ConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE;
USART_ConfigStruct.mode = USART_MODE_TX;
USART_ConfigStruct.parity = USART_PARITY_NONE;
USART_ConfigStruct.stopBits = USART_STOP_BIT_1;
USART_ConfigStruct.wordLength = USART_WORD_LEN_8B;
BOARD_COM_Config(COM1, &USART_ConfigStruct);
SystemCoreClockUpdate();
SysTick_Config(SystemCoreClock / 1000*16);
printf("Hello world!!!!!\n\r");
tick中断
void SysTick_Handler(void)
{
tick++;
}
代码经过编译下到开发板。可以运行。我想这个编程思想我以后肯定能用上。在一些极小需求又要象操作系统一下稳定的情况下可以一试。
研究了半天操作系统。我得出的结论是。操作系统之所以要是因为系统的并行,就是在做一件事我还可以做另一件事。而前后台系统只能做一件事。
|