单片机mian主逻辑的写法

MCU的程序结构大致有三类(裸机------时间片轮询) MCU的程序结构大致有三类: 1.1 简单的前后台顺序执行程序; 了解前后台系统之前先来了解一下***轮询系统*** 轮询系统是 MCU 中最简单的入门系统,它的程序结构是通常只需要一个 While(1)或For(;;)死循环来实现: //程序清单 1.1 ...... int main(void) { HwInit(); //初始化外设 while(1) { statement_1; //语句1 statement_2; / 阅读详情

单片机mian主逻辑的写法


双while(1)写法

在嵌入式系统编程中,尤其是在使用C语言编写的程序中,while(1) 循环通常用于创建一个无限循环,这样程序就可以持续运行,不会自行终止。
这种结构在嵌入式应用程序中非常常见,因为它们通常需要不断地响应外部事件,如用户输入、传感器数据或其他设备通信。
在您提供的 MODE_2 函数中,也包含了一个 while(1) 循环。这是因为 MODE_2是一个特定的模式,它需要在自己的函数中持续运行,直到被外部事件(如用户按下特定的键)中断,通过retrun跳出mode_2()。即使这个函数被包含在主程序的while(1) 循环中调用,它仍然需要自己的循环来处理该模式下的所有逻辑。 这里的结构是这样的:
1.主程序的 while(1)循环:这是程序的最外层循环,它不断地检查当前的模式(由 MEMU 变量控制),并调用相应的模式处理函数(如 MODE_1, MODE_2,MODE_3, MODE_4 等)。
2.模式函数内的 while(1) 循环:每个模式函数(如 MODE_2)内部也有自己的 while(1)循环。这个循环负责处理该模式下的所有逻辑,如读取传感器数据、更新显示、处理用户输入等。当需要退出该模式时(例如用户按下了返回键),函数会设置MEMU 变量到一个特定的值,这样主程序的 while(1) 循环就会调用另一个模式处理函数或退出当前模式。

------------------------主程序部分main.py----------------------------------------
int main (void)
{
	RCC_Configuration(); //时钟设置
	NVIC_Configuration();	//NVIC设置
	//串口通信部分
	uart1_init(9600);//连接昆仑屏——485 
	uart2_init(115200);	//连接摄像头板
	uart3_init(9600);	//连接语音板
	uart4_init(9600);//连接电视板
  uart5_init(115200);//连接舵机板
	TIM3_Int_Init(3600-1,10000-1); //定时周期500ms,用于各种计时
	//RTC部分
	RTC_Config();//初始化RTC时钟
	BKP_Configuration();//初始化BKP
	RTC_Set(2023,9,26,10,30,20);	//设置当前时间
	//显示部分
	LCD_Init();//LCD初始化
	LCD_Clear();
	KEYPAD5x4_Init();	//矩阵键盘初始化
	EXTIX_Init();//外部中断 初始化
	Relay_Init();//继电器初始化
	//云台部分
	Store_Init();
	bsp_Coordinate_instructions((float)(0),(float)(-19.5));//舵机初始化——复位到指定位置
	 
	while(1)
	{ 
		switch(MEMU) //判断MEMU值,执行对应模式函数
	  {   				      	
				case 0:  LCD_Start();break;	//初始等待界面
        case 1:  LCD_Clear();MODE_1(); break;	//模式1			  				      
				case 2:  LCD_Clear();MODE_2(); break;	//模式2		
        case 3:  LCD_Clear();MODE_3(); break;	//模式3				  				      
				case 4:  LCD_Clear();MODE_4(); break;	//模式4		
				case 10: LCD_Clear();LCD_Main(); break;	//模式选择界面	
//				case 20: LCD_Clear();Position_Display();break;	//显示坐标函数,画圈功能(去掉该功能)
				case 30: LCD_Clear();Records_Display();break;	//显示记录函数
				case 40: LCD_Clear();Pages_Display();break;//翻页函数
				case 50: Scrolling_Display();break;//滚屏函数	
//				case 60: LCD_Clear();Parameter_Setting();break;//配置识别参数函数(去掉该功能)
				case 70: LCD_Clear();Servos_Adjust();break;//舵机校准界面
		}
	}
}
-------------------------------------------------------------------------
-----------------------control.py---------------------------------------
void MODE_1(void)
{
	/*
		单片机——摄像头协议:
			模式:01静止图片  02慢速视频  03快速视频
			颜色: 00无颜色要求 01红色 02绿色 03蓝色 04黄色 05紫红 
						06青色 07棕色 08深绿 09深蓝 0a褐色 0b紫色 0c深青 			
			形状:00无形状要求 01三角形 02正方形 03五边形 04六边形 05平行四边形 
						06三角星 07四角星 08五角星 09六角星 0a八角星 
						0b黑桃 0c红桃 0d方块 0e梅花 0f圆形
			背景:00无 01白色 02黑色
	*/
	// 单片机——摄像头协议数组:      帧头,命令,模式,颜色,形状,背景,帧尾
	u8 command_to_camera_start_1[7]={0xAA,0x01,0x01,0x00,0x00,0x00,0x55};//向摄像头发送的开始指令
	u8 command_to_camera_stop_1 [7]={0xAA,0x00,0x01,0x00,0x00,0x00,0x55};//向摄像头发送的停止指令
	
//	//将设置的参数写入协议数组:背景——颜色——形状
//	command_to_camera_start_1[5] =	setting_parameter/100;//背景
//	command_to_camera_start_1[3] = (setting_parameter/10)%10;//颜色
//	command_to_camera_start_1[4] = setting_parameter%10;//形状

	//LCD显示文字
	LCD_ShowChinese(0,0,"静态图片",RED,WHITE,32,0);
	LCD_ShowChinese(0,40,"计时:",RED,WHITE,32,0);
	LCD_ShowString(96,40,"   S",RED,WHITE,32,0);
	LCD_ShowChinese(0,80,"时间:",RED,WHITE,32,0);
 
	USART2_Send_Message(command_to_camera_start_1,7);//向摄像头发送开始识别指令
	delay_s(2);	//延时使摄像头初始化	
	USART4_Send_Message((u8*)"FJD01",6);//向电视板发送 播放指令
	MODE1.timer_flag = 1; //计时开启
		
	while(1)
	{
		RTC_Get();//读取RTC时钟
		sprintf((char*)time_buf,"%02d:%02d:%02d",rhour,rmin,rsec);//将时间放入要在LCD屏上显示的字符串
		LCD_ShowString(96,80,time_buf,RED,WHITE,32,0);		//显示当前时间
		LCD_ShowIntNum(96,40,MODE1.count,2,RED,WHITE,32);//显示计时时间
		if(KEYPAD5x4_Read() == KEYPAD_F1)//再按F1,退回到主界面
		{
			MEMU = 10; 
			MODE1.count = 0;			//定时器计时时间清0
			MODE1.timer_flag = 0;	//定时器计时停止
			//以下两个变量为防止视频卡死,退出时清0
			camera_timer_flag =0;//暂停定时标志位清0
			pause_count = 0;	//暂停定时计数清0,这个计时只有模式2,模式3有
			bsp_Coordinate_instructions((float)(0),(float)(-19.5));//舵机初始化——复位到指定位置
			USART4_Send_Message((u8*)"FJDSTOP",8);//向电视板发送 停止播放指令
			delay_ms(50);
			USART2_Send_Message(command_to_camera_stop_1,7);//通知摄像头停止识别
			return;//##检测到按键KEYPAD5x4_Read() == KEYPAD_F1,停止视频,如何跳出函数
		}

		//在这进行串口接收完成等待
		if(USART2_RX_STA) //接收到摄像头板发来的报文,进入坐标画圈模式,定时关闭,
		{
			USART2_RX_STA = 0;
			Usart2_process();//分析报文数据
			Usart2_ResetRXbuffer();
		}
	}	
}

------------------------------------------------------------------------

关于裸机调度的时间片

优点:针对不同的模块,调用时间间隔不同,合理利用系统资源。
视频教材:https://cloud.189.cn/t/2uIBrya2MnIj(访问码:2jic)

main.c


typedef struct
{
	uint8_t run;                // 调度标志,1:调度,0:挂起
	uint16_t timCount;          // 时间片计数值
	uint16_t timRload;          // 时间片重载值
	void (*pTaskFuncCb)(void);  // 函数指针变量,用来保存业务功能模块函数地址
} TaskComps_t;

static TaskComps_t g_taskComps[] = 
{
	{0, 5,    5,     HmiTask},
	{0, 10,   10,    WifiNetworkTask},
	{0, 100,  100,   SensorTask},
//	{0, 1000, 1000,  BatteryDrvTest},	
	{0, 1000, 1000,  BatteryTask},
	/* 添加业务功能模块 */
};

#define TASK_NUM_MAX   (sizeof(g_taskComps) / sizeof(g_taskComps[0]))

static void TaskHandler(void)
{
	for (uint8_t i = 0; i < TASK_NUM_MAX; i++)
	{
		if (g_taskComps[i].run)                  // 判断时间片标志
		{
			g_taskComps[i].run = 0;              // 标志清零
			g_taskComps[i].pTaskFuncCb();        // 执行调度业务功能模块
		}
	}
}

/**
***********************************************************
* @brief 在定时器中断服务函数中被间接调用,设置时间片标记,
         需要定时器1ms产生1次中断
* @param
* @return 
***********************************************************
*/
static void TaskScheduleCb(void)
{
	for (uint8_t i = 0; i < TASK_NUM_MAX; i++)
	{
		if (g_taskComps[i].timCount)
		{
			g_taskComps[i].timCount--;
			if (g_taskComps[i].timCount == 0)
			{
				g_taskComps[i].run = 1;
				g_taskComps[i].timCount = g_taskComps[i].timRload;
			}
		}
	}
}

static void DrvInit(void)
{
	DelayInit();
	LedDrvInit();
	KeyDrvInit();
	RtcDrvInit();
	SystickInit();

	WifiModuleDrvInit();
	LcdDrvInit();
	TempHumiDrvInit();
	Pm25DrvInit();
	BatteryDrvInit();
}
static void AppInit(void)
{
	TaskScheduleCbReg(TaskScheduleCb);
}

int main(void)
{	
	DrvInit();
	AppInit();
	DelayNms(1000);
	HmiTest();
//	RtcTime_t rtcTime = {2024, 4, 15, 16, 25, 30};
//	SetRtcTime(&rtcTime);
	while (1)
	{
		TaskHandler();//
	}
}

systick.c

#include <stdint.h>
#include <stdlib.h>
#include "gd32f30x.h"

static volatile uint64_t g_sysRunTime = 0;

static void (*g_pTaskScheduleFunc)(void);          // 函数指针变量,保存任务调度的函数地址

/**
***********************************************************
* @brief 注册任务调度回调函数
* @param pFunc, 传入回调函数地址
* @return 
***********************************************************
*/
void TaskScheduleCbReg(void (*pFunc)(void))
{
	g_pTaskScheduleFunc = pFunc;
}

/**
***********************************************************
* @brief systick初始化
* @param
* @return 
***********************************************************
*/
void SystickInit(void)
{
	/*1ms 产生一次定时中断*/
	if (SysTick_Config(rcu_clock_freq_get(CK_AHB) / 1000))
	{
		while (1);
	}
}

/**
***********************************************************
* @brief 定时中断服务函数,1ms产生一次中断
* @param
* @return 
***********************************************************
*/
void SysTick_Handler(void)
{
	g_sysRunTime++;
	if (g_pTaskScheduleFunc == NULL)
	{
		return;
	}
	g_pTaskScheduleFunc();
}

/**
***********************************************************
* @brief 获取系统运行时间
* @param
* @return 以1ms为单位
***********************************************************
*/
uint64_t GetSysRunTime(void)
{
	return g_sysRunTime;
}

裸机时间片调度任务框架:从大循环到多任务实现 在嵌入式开发中,裸机程序常采用前后台大循环结构,随着业务逻辑增多,串行执行导致的任务响应延迟和时序冲突成为典型痛点。时间片调度算法将CPU时间分割为固定节拍,使多个任务轮流获得执行机会,从原理上讲是一种协作式多任务机制,相较于完整RTOS,其实现成本低、资源占用小,特别适合中小型单片机场景。通过定时器中断产生时基,配合任务控制块与主循环扫描,即可构建起毫秒级响应的裸机调度框架。本文从基础概念出发,分析前后台系统局限性,并围绕任务表结构、非抢占式调度流程、状态机设计以及调试技巧展开介绍,帮助嵌入式工程师理清多 阅读详情

相关推荐

基于STM32裸机的简单任务调度

任务调度程序(Task Scheduler)是一种能够管理多个任务按照特定的顺序或优先级执行的系统。在裸机(Bare-metal)环境中,任务调度通常是非抢占式的,意味着一个任务必须主动释放控制权,下一个任务才能开始执行。这种类型的调度器适合资源受限或实时性要求不极高的嵌入式应用。首先,定义一个任务的结构体,其中包括任务的状态、任务函数指针和可能需要的任何参数。// 任务函数,带有当前时钟周期参数// 执行周期// 最后一次执行的时钟周期// 任务当前的状态} Task;

2401_84204806的博客 1905

单片机裸机开发之“时间片轮询架构”去实现“多任务”

单片机多任务,时间片轮询

m0_52596850的博客 4696

时间片轮询+状态机实现裸机多任务

时间片+状态机实现裸机伪多任务 注:上述伪多任务是按个人理解命名的,实际上在裸机中跑的还是单线程,只是效果看上去是多线程。 时间片轮询方式是把MCU的执行时间划分为一块一块的,然后根据自己的需求去分配这一块一块的时间,而当你的任务(在时间片轮询方法中实现的任务)的执行时间足够短的时候可以实现多线程的现象,效果如下图所示: 而当你的任务所需要的的时间不能在一个时间片的情况下完成时,此时就会出现一直在执行某一个任务,而现象则是跟裸机大循环(前后台系统)类似的现象出现,如下图所示: 出现此现象的原因跟时间片轮

qq_44711012的博客 6114

裸机环境实现多任务调度(例程及源码)

无RTOS(裸机环境)下实现分时调度法,非常适用于单片机环境下的一般应用场景。 RTOS优点不用多说了,但对于一些简单的业务需求,移植一个操作系统又显得非常麻烦,且非常占用系统资源。 通常的做法是在一个大while下执行各个业务函数,通过多个定时器去控制各个函数的执行周期,利用几个全局变量关联各个模块功能。 但这样的做法在多轮开发下,会造成 代码非常臃肿,模块关系混乱,不利于阅读。 为了解决这个问题,手动码了一个简单的多任务调度,封装成接口供大家使用! 实现方式:创建任务时,设定好任务的调度周期和

qq_37830757的博客 6734

嵌入式裸机设计思想——时间片轮裸机开发架构+状态机+定时器调度机制

嵌入式裸机设计思想——时间片轮裸机开发架构+状态机+定时器调度机制

在嵌入式嵌入式领域奋斗的程序猿的博客 9809

别再手动调参数了!用3ds Max的tyDiffusion插件,5分钟搞定AI动态纹理生成

本文介绍了3ds Max的tyDiffusion插件如何通过AI技术快速生成动态纹理,大幅提升3D美术师的工作效率。从火焰、水流到布料飘动,tyDiffusion能在5分钟内完成传统手工需要数小时的任务,且效果更自然。文章详细解析了插件的核心功能、实战配置及进阶应用,帮助用户轻松实现AI动态纹理生成。

weixin_30919429的博客 670

裸机程序--时间片调度

a. 网上其实有很多成熟的时间片调度例程, 包括我最开始参加工作也是抄的网上的例程(还记得当时领导问我看明白了它的调度原理吗, 作为一个自学刚参加工作的我来说, 看懂别人的意思真的很难, 当时只能含糊其词的说看得差不多)b. 在我看来网上的例程是有一些问题的, 计算时间的那个函数放到定时器中递减, 随着任务的增加, 定时器定时越不准确, 违背了中断的快进快出, 不过话说回来时间片本来就是一个不准确的定时.c. 违背了软件的开闭原则, 每次添加任务都需要进去修改那个定义任务调度的数组.

自学嵌入式 968

告别‘小目标’丢失!手把手复现DNANet红外检测网络(PyTorch版)

本文详细介绍了如何使用PyTorch从零实现DNANet红外小目标检测网络,重点解析了DNIM模块和CSAM注意力机制的设计与实现。通过实战教程,帮助开发者解决红外小目标检测中的特征提取和训练调参难题,适用于军事侦察、安防监控等场景。

weixin_28701593的博客 252

嵌入式单片机程序架构之顺序结构

这种方法,这应用程序比较简单,实时性,并行性要求不太高的情况下是不错的方法,程序设计简单,思路比较清晰。但是当应用程序比较复杂的时候,如果没有一个完整的流程图,恐怕别人很难看懂程序的运行状态,而且随着程序功能的增加,编写应用程序的工程师的大脑也开始混乱。即不利于升级维护,也不利于代码优化。本人写个几个比较复杂一点的应用程序,刚开始就是使用此法,最终虽然能够实现功能,但是自己的思维一直处于混乱状态。

wangshuwang的专栏 3184

Elsevier期刊LaTeX双栏模板(cas-dc)实战:从Overleaf配置到投稿全流程

本文详细介绍了Elsevier期刊LaTeX双栏模板(cas-dc)在Overleaf平台上的配置与使用全流程,包括模板结构解析、标题与作者信息规范、摘要与关键词特殊格式、正文写作技巧、参考文献管理以及投稿前检查清单。特别针对Elsevier期刊投稿需求,提供了从模板安装到最终投稿的实用指南,帮助研究者高效完成论文排版工作。

weixin_28455801的博客 1323

基于LSTM语义分析的企业风险预测系统

在数字化时代,企业面临着前所未有的挑战和机遇,而风险管理作为确保企业稳定发展的关键一环,其重要性日益凸显。为了及时、准确地监测和分析企业相关的风险,并预测可能带来的风险,本文介绍了一种基于长短期记忆(LSTM)语义分析的企业风险预测系统。该系统利用深度学习技术,通过将收集到的企业数据进行预处理和分析,结合LSTM模型对文本进行深度语义分析,从而实现对潜在风险的预测和评估。系统设计方面,该系统包括数据预处理、LSTM模型构建与训练、风险预测以及可视化展示等模块。

qiufangtaowvnyyidtf的博客 1392

stm32裸机开发下利用MultiTimer多任务时间片询

stm32裸机开发下利用MultiTimer多任务时间片询

perseverance51博客 2964

TwinCAT报SSE invalid operation错误

错误类型 TwinCAT程序中报出以下错误: 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 **** 383 ms | 'Port_851' (851): Exception (Exception Code: 0xc0000090, SSE invalid operation) in PLC Application Untitled1 Instance, Task PlcTask (RBP: 0xffffb3016c80ecc0, RIP: 0xffffe708ee5b5f53, RSP:

akadiao的博客 4162

基于时间片+状态机的裸机框架学习总结

在工作和学习中,我们对单片机的裸机开发使用不需要快速响应,只需要每隔一段时间执行一次程序时,我们就可以考虑这种基于时间片+状态机的裸机框架进行软件开发。

qq_46946054的博客 2483

SRv6第二弹:SRv6基本概念

在SRv6网络编程中,不同的转发行为由不同的Function来标识,例如在RFC中定义了公认的End、End.X、End.DX4、End.DX6等。例如:R3使用报文的IPv6目的地址FC03::3查找Local SID表,命中到End SID,随后R3将报文SL减1,同时将SL=1的SID做为报文目标IPv6地址,并查路由表转发出去。SID支持静态配置或者动态分配,end-op、end、end.x、end-dt4、end-dt6、end-dx2推荐静态配置 ,便于网络运维,其他的SID可以动态分配。

wbyyy的博客 4251

华为校招&实习&留学生机试真题目录+算法分类+在线OJ+通过率+视频讲解

全网最新最全华为校招&实习&留学生机试真题题库

m0_73659489的博客 6872

ARM 单片机裸机任务调度框架

在没有使用操作系统的情况下,一个合理的裸机任务调度方式,可以更好的提供数据的处理,和用户体验,有多种任务调度的方式。仅介绍任务调度框架,具体使用第三种的任务调度方式,参考郭天祥老师ARM32教程仅用于学习参考。

qq_45973003的博客 3291

【技术科普】破解政务跨系统数据壁垒!亘川一网统管平台多源数据同步技术解析

本文解析亘川一网统管平台多源数据同步技术,针对政务跨系统数据壁垒难题,介绍组件的数据采集、校验、审计留痕等核心能力,结合营商环境项目落地案例,对比传统开发模式差异,讲解开源组件的实践价值,为政务项目开发者提供落地参考。

weixin_67440240的博客 635

常用单片机编程思想及例程7——裸机开发中时间片及软件定时器应用

自定义的裸机时间片管理及软件定时器应用

陈大本事的博客 1956

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

基于systick实现获取系统运行时间

该代码段是一个典型的systick模块,实现了系统时钟初始化、定时中断服务以及获取系统运行时间功能。代码结构清晰、模块化设计、层次分明、接口简洁,易于理解和维护。rcu_clock_freq_get(CK_AHB): 获取AHB时钟频率SysTick_Config(): 配置SysTick定时器while (1);: 死循环g_sysRunTime++: 将系统运行时间加1return g_sysRunTime: 返回系统运行时间。

weixin_52849254的博客 1279

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

GD 32 系統Systick定时器

软件消除抖动:设定一个事件窗T在某一个时刻按键按下处于低电平的状态,当超过这个时间窗的时候再次判断按键的电平状态如果还是低电平那么表示按键被按下,松开状态的确定如果检测到按键的状态为低电平,在超过时间窗的同时如果按键是高电平那么表示按键是松开的状态。实现时间窗的方式可以是软件延时死等的方式实现时间窗,判断引脚为低电平的时候表示按键按下但是软件延时死等的方式并没法使用在实际的项目开发中,软件延时死等的方式会导致系统停止在延时死等的位置,导致系统卡死。systick定时器的程序框图。软件延时消除抖动示例代码。

qq_45973003的博客 1444

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

裸机任务调度框架(时间片轮询 + 事件驱动混合调度)

框架还不够完美,仍需优化,继续改进,期待下一篇哟。混合调度(时间片轮询 + 事件驱动)时间片轮询:确保周期性任务(如传感器采集)按时执行。事件驱动:快速响应外部中断(如按键、通信)。优先级控制:通过排序实现简单优先级调度。

qq_56152172的博客 4081

单片机裸机常用的时间片轮训系统

基本逻辑就是每ms执行一次中断,将数组的数据都减1,在main.c里面的while{1}里,循环的判断数组的数据什么时候减到为0,等于0的立马给填充回原先设定的时间。现在再想处理最初的30s延时功能,只需要在1s的条件下,设定一个标志累加30次,到30的时候清除,去打开继电器就好了。那我学习初期遇到一种问题就很棘手,比如我想在ADC采集温度到88度时,打开一个继电器,延时30后,打开第二个继电器。我学单片机初期的时候是没有接触过什么操作系统的,后续接触过FreeRTOS,了解过一下时间片轮训和抢占式。

GQli2296523792的博客 648

裸机实现任务调度

【几种常用的裸机程序任务调度方案】https://www.bilibili.com/video/BV1si421h768?在这里介绍两种根据裸机根据定时器进行系统任务调度的方法,来自于郭天祥老师的课程。

m0_74307146的博客 1757

基于状态机的按键扫描实验

基于状态机的按键扫描实验,实验平台(正点原子精英板)

weixin_47736278的博客 1196

简单OS(ucos超级精简版)——裸调度器【worldsing笔记】

简单原则少ROM,少RAM,任务完成就让出CPU,调度器描述: 1、按最大任务数轮番调度; 2、任务调用延时接口将让出CPU使用权,进入下一个任务调度; 3、用户任务都处于延时或是不使用CPU运行Idle任务; 4、最大任务数255; 5、任务用独立栈,栈大小由用户自定义; 6、调度器无需初始化,代码为单个C文件,结构简单,代码尺寸小; 7、调度器加3个任务代码尺寸:Code=142...

weixin_30517001的博客 418
上一篇: 三极管和mos管导通条件
下一篇: stm32部分元器件
物语系列
博客等级 码龄6年 582粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值