协同例程使用setjmp实现

协同例程是某种类似于多线程的概念,只是线程的切换由程序自己掌控,可以避免传统线程间切换时的数据保护问题。

这里使用setjmp和longjmp的配合(形式上是从一个函数跳到另一个函数,实际上是返回历史执行点),实现了比较简陋的协同例程。

下面程序执行流程就体现了,执行流在main的while loop和aux的while loop之间跳转,依次执行。

注:此处代码是在Dev-CPP中编译运行的

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <setjmp.h>

int main_stack[256];
int aux_stack[256];
jmp_buf main_jmp;
jmp_buf aux_jmp;
int *co_base = NULL; // 分离点
int *main_top = NULL;
int *aux_top = NULL;

int aux();
void co_swap_aux();
void co_swap_main();
void co_save(int stack[], int *co_top);
void co_restore(int stack[], int *co_top);

int main()
{
	int base;
	co_base = &base;
	main_top = co_base;
	co_save(main_stack, main_top);
	if(!setjmp(main_jmp))
	{
		aux();
	}
	co_restore(main_stack, main_top);
	while(1)
	{
		printf("run in main...1\n");
		system("PAUSE");
		co_swap_main();

		printf("run in main...2\n");
		system("PAUSE");
		co_swap_main();

		printf("run in main...3\n");
		system("PAUSE");
		co_swap_main();
	}

	return 0;
}

int aux()
{
	while(1)
	{
		printf("run in aux....1\n");
		system("PAUSE");
		co_swap_aux();

		printf("run in aux....2\n");
		system("PAUSE");
		co_swap_aux();

		printf("run in aux....3\n");
		system("PAUSE");
		co_swap_aux();
	}
	return 0;
}

void co_swap_aux()
{
	int top;
	aux_top = &top;
	co_save(aux_stack, aux_top);
	if(!setjmp(aux_jmp))
	{
		longjmp(main_jmp, 1);
	}
	co_restore(aux_stack, aux_top);
}

void co_swap_main()
{
	int top;
	main_top = &top;
	co_save(main_stack, main_top);
	if(!setjmp(main_jmp))
	{
		longjmp(aux_jmp, 1);
	}
	co_restore(main_stack, main_top);
}

void co_save(int stack[], int *co_top)
{
	size_t size = (long)co_base - (long)co_top;
	memcpy(stack, co_top, size);
}

void co_restore(int stack[], int *co_top)
{
	size_t size = (long)co_base - (long)co_top;
	memcpy(co_top, stack, size);
}

运行界面截图:


EtherCAT控制LED开发例程使用手册 1. 引言 本手册旨在介绍如何使用EtherCAT实现控制LED的开发例程。通过本手册的指导,开发人员可以快速上手并实现基于EtherCAT的LED控制应用程序。 2. 硬件准备 在使用EtherCAT控制LED之前,需要准备一些硬件设备,包括Ethernet通信接口模块、LED控制器和相应的连接线路。确保硬件设备连接正确并且供电正常。 3. 软件设置 在进行EtherCAT控制LED开发前,需安装相应的开发环境和驱动程序。确保EtherCAT驱动程序已正确安装并且可以正常运行。 4. 示例代码 本手册提供了基于EtherCAT的LED控制示例代码,开发人员可以按照示例代码进行修改和调试。示例代码中包括了初始化EtherCAT通信模块、配置LED控制器参数和发送控制指令等功能。 5. 开发步骤 在实际开发过程中,开发人员可以按照以下步骤进行操作: a. 初始化EtherCAT通信模块,建立和主控制器的通信连接; b. 配置LED控制器参数,包括LED的亮度、颜色等; c. 发送控制指令,实现对LED的开关、闪烁等功能。 6. 调试和应用 在开发完成后,需要进行调试和测试,确保LED控制功能正常。在实际应用中,可以根据具体需求进行扩展和优化,实现更丰富的LED控制效果。 通过本手册的指导,开发人员可以快速上手并实现基于EtherCAT的LED控制应用程序,为相关领域的应用提供技术支持和解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值