标题:
发个STM32F103单片机8任务RTX例程,带Proteus仿真
[打印本页]
作者:
ZHAOBAO511
时间:
2024-9-13 10:55
标题:
发个STM32F103单片机8任务RTX例程,带Proteus仿真
909096.png
(73.7 KB, 下载次数: 7)
下载附件
2024-9-13 10:54 上传
单片机源程序如下:
#include "includes.h" /* 底层硬件驱动 */
#include "usart.h"
/*
**********************************************************************************************************
函数声明
**********************************************************************************************************
*/
static void AppTaskCreate (void);
__task void AppTaskLED(void);
__task void AppTaskStart(void);
/*
安 富 莱 电 子
**********************************************************************************************************
变量
**********************************************************************************************************
os_sem_init
os_sem_send
isr_sem_send
os_sem_wait
*/
static uint64_t AppTaskLEDStk[256/8]; /* 任务栈 */
static uint64_t AppTaskStartStk[512/8]; /* 任务栈 */
/* 任务句柄 */
OS_TID HandleTaskLED = NULL;
/* 任务句柄 */
OS_TID HandleTaskLED1 = NULL;
static uint64_t AppTaskLED1Stk[256/8]; /* 任务栈 */
/* 任务句柄 */
OS_TID HandleTaskLED2 = NULL;
static uint64_t AppTaskLED2Stk[256/8];
OS_TID HandleTaskLED3 = NULL;
static uint64_t AppTaskLED3Stk[256/8];
OS_TID HandleTaskLED4 = NULL;
static uint64_t AppTaskLED4Stk[256/8];
OS_TID HandleTaskLED5 = NULL;
static uint64_t AppTaskLED5Stk[256/8];
OS_TID HandleTaskLED6 = NULL;
static uint64_t AppTaskLED6Stk[256/8];
OS_TID HandleTaskLED7 = NULL;
static uint64_t AppTaskLED7Stk[256/8];
OS_SEM semaphore;
/*
*********************************************************************************************************
* 函 数 名: main
* 功能说明: 标准 c 程序入口。
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
int main (void)
{
/* 初始化外设 */
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
uart_init(9600); //串口初始化为9600
/* 创建启动任务 */
os_sys_init_user (AppTaskStart, /* 任务函数 */
1, /* 任务优先级 */
&AppTaskStartStk, /* 任务栈 */
sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */
while(1);
}
/*
*********************************************************************************************************
* 函 数 名: AppTaskLED
* 功能说明: LED 闪烁
* 形 参: 无
* 返 回 值: 无
* 优 先 级: 1 (数值越小优先级越低,这个跟 uCOS 相反)
*********************************************************************************************************
*/
__task void AppTaskLED(void)
{
/* 创建信号量计数值是0, 用于任务同步 */
os_sem_init (&semaphore, 0);
while(1)
{
os_dly_wait(50);
os_sem_send(&semaphore);
LED0=~LED0;
os_dly_wait(10);
}
}
/*
*********************************************************************************************************
* 函 数 名: AppTaskLED
* 功能说明: LED 闪烁
* 形 参: 无
* 返 回 值: 无
* 优 先 级: 1 (数值越小优先级越低,这个跟 uCOS 相反)
*********************************************************************************************************
*/
__task void AppTaskLED1(void)//LED1
{
OS_RESULT xResult;
while(1)
{
xResult= os_sem_wait(&semaphore, 20);
switch(xResult)
{
/*无需等待接受到信号量同步信号 */
case OS_R_OK:
//printf("无需等待接受到信号量同步信号\r\n");
LED1=~LED1;
os_dly_wait(10);
break;
/*信号量不可用,usMaxBlockTime等待时间内收到信号量同步信号 */
case OS_R_SEM:
//printf("信号量不可用,usMaxBlockTime等待时间内收到信号量同步信号\r\n");
LED2=~LED2;
os_dly_wait(20);
break;
/*超时 */
case OS_R_TMO:
//bsp_LedToggle(1);
//bsp_LedToggle(4);
LED3=~LED3;
os_dly_wait(30);
break;
/*其他值不处理 */
default:
//os_dly_wait(100);
break;
}
//os_dly_wait(100);
}
}
/*
*********************************************************************************************************
* 函 数 名: AppTaskLED
* 功能说明: LED 闪烁
* 形 参: 无
* 返 回 值: 无
* 优 先 级: 1 (数值越小优先级越低,这个跟 uCOS 相反)
*********************************************************************************************************
*/
__task void AppTaskLED2(void)
{
u8 t;
u8 len;
u16 times=0;
while(1)
{
//read_stm32_id();
printf("\r\n您发送的消息为:\r\n");
/*
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
printf("\r\n您发送的消息为:\r\n");
for(t=0;t<len;t++)
{
USART1->DR=USART_RX_BUF[t];
while((USART1->SR&0X40)==0);//等待发送结束
}
printf("\r\n\r\n");//插入换行
USART_RX_STA=0;
}else
{
times++;
if(times%5000==0)
{
printf("\r\nALIENTEK MiniSTM32开发板 串口实验\r\n");
printf("正点原子@ALIENTEK\r\n\r\n\r\n");
}
if(times%200==0)printf("请输入数据,以回车键结束\r\n");
if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
delay_ms(10);
}*/
os_dly_wait(500);
}
}
__task void AppTaskLED3(void)
{
while(1)
{
//LED3=~LED3;
os_dly_wait(30);
}
}
__task void AppTaskLED4(void)
{
while(1)
{
LED4=~LED4;
os_dly_wait(40);
}
}
__task void AppTaskLED5(void)
{
while(1)
{
LED5=~LED5;
os_dly_wait(50);
}
}
__task void AppTaskLED6(void)
{
while(1)
{
LED6=~LED6;
os_dly_wait(60);
}
}
__task void AppTaskLED7(void)
{
while(1)
{
LED7=~LED7;
os_dly_wait(70);
}
}
/*
*********************************************************************************************************
* 函 数 名: AppTaskStart
* 功能说明: 启动任务,也就是最高优先级任务。
* 形 参: 无
* 返 回 值: 无
* 优 先 级: 2
*********************************************************************************************************
安 富 莱
*/
__task void AppTaskStart(void)
{
AppTaskCreate();
while(1)
{
LED8=~LED8;
os_dly_wait(800);
}
}
/*
*********************************************************************************************************
* 函 数 名: AppTaskCreate
* 功能说明: 创建应用任务
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
static void AppTaskCreate (void)
{
HandleTaskLED = os_tsk_create_user(AppTaskLED, /* 任务函数 */
8, /* 任务优先级 *///数字越小,优先级越低和UCOS相反
&AppTaskLEDStk, /* 任务栈 */
sizeof(AppTaskLEDStk)); /* 任务栈大小,单位字节数 */
HandleTaskLED1 = os_tsk_create_user(AppTaskLED1, /* 任务函数 */
2, /* 任务优先级 *///数字越小,优先级越低和UCOS相反
&AppTaskLED1Stk, /* 任务栈 */
sizeof(AppTaskLED1Stk)); /* 任务栈大小,单位字节数 */
HandleTaskLED2 = os_tsk_create_user(AppTaskLED2,
3,
&AppTaskLED2Stk,
sizeof(AppTaskLED2Stk));
HandleTaskLED3 = os_tsk_create_user(AppTaskLED3,
4,
&AppTaskLED3Stk,
sizeof(AppTaskLED3Stk));
HandleTaskLED4 = os_tsk_create_user(AppTaskLED4,
5,
&AppTaskLED4Stk,
sizeof(AppTaskLED4Stk));
HandleTaskLED5 = os_tsk_create_user(AppTaskLED5,
6,
&AppTaskLED5Stk,
sizeof(AppTaskLED5Stk));
HandleTaskLED6 = os_tsk_create_user(AppTaskLED6,
7,
&AppTaskLED6Stk,
sizeof(AppTaskLED6Stk));
HandleTaskLED7 = os_tsk_create_user(AppTaskLED7,
9,
&AppTaskLED7Stk,
sizeof(AppTaskLED7Stk));
}
复制代码
仿真和程序:
STM32F103_rtx_LED2 (1).7z
(1.04 MB, 下载次数: 19)
2024-9-13 13:00 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
lkhlkh
时间:
2024-9-29 22:53
感谢楼主分享,学习了!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1