被你这么一说,忽然感觉多线程好像里我也不远
看了王老师的代码,使用了涵数指针。但不明白王老师为什么把定时器设置功能,设计的那么复杂,要用到T4和T11定时器来进行计算。这给移植带来了许多困难。
康辉55AA 发表于 2026-1-22 11:11
看了王老师的代码,使用了涵数指针。但不明白王老师为什么把定时器设置功能,设计的那么复杂,要用到T4和T1 ...
你可以随便做一个定时器中断,把多线程的处理函数放进去就行了。
我那个是源于一个定时器的库,为了方便配置做的而已,内部复杂是肯定的,但是配置起来比较简单
STC32G8K的,将协程移植放进去,task_delay(1000);不是一1S。非常快,串口一直不停的发。根本没延时,P34P35是LED灯也不受控。怎么也关不掉。是怎么回事,以下是各相关的代码,帮忙看一下
void Task11(void)
{
task_start(11);
TX1_write2buff(0x30);
TX1_write2buff(0x37);
TX1_write2buff(0x31);
TX1_write2buff(0x30);
P34=~P34;
P35=~P35;
task_delay(1000);
task_end(1);
}
……………………
#define Task_Max_Num 12
……
//每隔任务的数据结构
typedef struct
{
unsigned int time;
unsigned long state;
} _task;
……
void Timer_config(void)
{
TIM_InitTypeDef TIM_InitStructure; //结构定义
TIM_InitStructure.TIM_Mode = TIM_16BitAutoReload; //指定工作模式, TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T; //指定时钟源, TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
TIM_InitStructure.TIM_ClkOut = DISABLE; //是否输出高速脉冲, ENABLE或DISABLE
TIM_InitStructure.TIM_Value = (u16)(65536UL - (MAIN_Fosc / 1000UL)); //中断频率, 1000次/秒
TIM_InitStructure.TIM_PS = 0; //8位预分频器(n+1), 0~255
TIM_InitStructure.TIM_Run = ENABLE; //是否初始化后启动定时器, ENABLE或DISABLE
Timer_Inilize(Timer0,&TIM_InitStructure); //初始化Timer0 Timer0,Timer1,Timer2,Timer3,Timer4
NVIC_Timer0_Init(ENABLE,Priority_0); //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
}
……
void Timer0_ISR_Handler (void) interrupt TMR0_VECTOR //进中断时已经清除标志
{
set_task_mode();
}
按照王老师的思路,我用STCISP中的魔方生成了STC8H8K64U的代码框架,然后把协程的代码加进去,放弃原协程的定时器设置文件,使用代码框架中的定时器0产生的1ms节拍,成功移植到了STC8H8K64U上面。
谢谢王老题指点。{:4_201:}
iroplbxk 发表于 2026-1-23 10:02
STC32G8K的,将协程移植放进去,task_delay(1000);不是一1S。非常快,串口一直不停的发。根本没延时,P34P3 ...
void Task11(void)
{
task_start(11);
TX1_write2buff(0x30);
TX1_write2buff(0x37);
TX1_write2buff(0x31);
TX1_write2buff(0x30);
P34=~P34;
P35=~P35;
task_delay(1000);
task_end(1);
}
task_start 和task_end需要配对使用,你关闭的是任务1,任务11一直处于打开状态,没有关闭。
康辉55AA 发表于 2026-1-23 11:08
void Task11(void)
{
task_start(11);
#define task_end(reload) if(reload)user_task.state=0;else user_task.state = __LINE__;break;}
//线程结束,内部填入是否重新开始线程,1为重新开始,0为结束等待
iroplbxk 发表于 2026-1-23 11:19
#define task_end(reload) if(reload)user_task.state=0;else user_task.state...
任务有最大数量限制,如果使用到11,记得调整一下h文件中的定义,否则数组是没有定义到的,会跑飞
{:qiang:}{:qiang:}{:qiang:}王工真是英雄之见略同呀
我们也有一个类似的TTSS架构 和你的协程类似的思路 我们也叫伪时间片的操作系统,是一个严格按流程图完成的嵌入式的系统软件设计架构, 脚手架级别的设计,容易上手