同步操作将从 eLab/basic-os 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
邮箱:event-os@outlook.com,微信号:Event-OS,QQ群:667432915。兄弟项目:EventOS Nano
EventOS Basic,是一个超级简洁的协作式内核。它的特点有二:一是协作式,不抢占,按优先级轮询,当前任务不释放CPU控制权,其他任务得不到CPU,二是超级轻量(ROM 968字节,RAM 64字节,-O3)。目前提供出来的功能非常基础,主要有两部分,一是任务功能,二是软定时器功能。 任务功能如下:
软定时器功能如下:
这个代码,功能虽然少,但对于任务并发来说,已经完全足够了。由于是协作内核,任务之间不抢占,完全可以十分放心的使用全局变量,进行任务间通信和信息共享。
之所以启动EventOS Basic这个项目,是因为EventOS Nano项目释放出来后,我发现事件驱动的概念,对一部分嵌入式工程师来说,还是有些不习惯。EventOS Nano实际上引入了多个概念,比如面向对象、事件驱动、控制反转等等,这些概念交织在EventOS Nano的源码里,很难一下让人接受下来。EventOS Basic就诞生了。EventOS Basic在传统的任务机制和EventOS Nano的事件机制之间,提供了一个过渡。
另外,EventOS Basic还要启动一个新的开发模式,那就是它从一开始,只提供最小功能,然后充分听取用户的意见,按照大多数用户的意见开发。这样做的目的,是为将来的EventOS的技术走向,收集需求。
但无论怎么样,有两点是没有办法变的:
这样,EventOS Basic、EventOS Nano和EventOS三个版本各自承担的就比较清晰了:
线程锁、信号量,都没有必要在EventOS Basic增加,因为EventOS Basic是协作式,非抢占的内核。 邮箱与消息队列等线程间通信功能,可以对全局变量进行数据结构的合理组织,很方便的实现。
使用时,要遵循以下注意点。
任务启动的过程如下所示:
/* data --------------------------------------------------------------------- */
static uint64_t stack_led[32];
eos_task_t led;
static uint64_t stack_count[32];
eos_task_t count;
static uint64_t stack_test_exit[32];
eos_task_t test_exit;
/* main function ------------------------------------------------------------ */
int main(void)
{
if (SysTick_Config(SystemCoreClock / 1000) != 0)
while (1);
static uint64_t stack_idle[32];
eos_init(stack_idle, sizeof(stack_idle)); // EventOS初始化
// 启动LED闪烁任务
eos_task_start(&led, task_entry_led, 1, stack_led, sizeof(stack_led));
// 启动计数任务
eos_task_start(&count, task_entry_count, 2, stack_count, sizeof(stack_count));
eos_run(); // EventOS启动
return 0;
}
任务函数的实现如下。在任务里也可以启动其他任务。
uint8_t led_status = 0;
static void task_entry_led(void)
{
eos_task_start(&test_exit, task_entry_test_exit, 3, stack_test_exit, sizeof(stack_test_exit));
while (1) {
led_status = 0;
eos_delay_ms(500);
led_status = 1;
eos_delay_ms(500);
}
}
任务退出时,其应用如下所示。
uint32_t count_num_exit = 0;
static void task_entry_test_exit(void)
{
for (int i = 0; i < 10 ; i ++) {
count_num_exit ++;
eos_delay_ms(10);
}
eos_exit();
}
系统滴答函数,放在定时器中断里,最好放在SysTick中断里。
void SysTick_Handler(void)
{
eos_tick();
}
在目前的移植中,M0 - M7全系列的ARM Cortex-M的例程已经齐备,已经支持MDK AC5和AC6。但有一个需要注意的点,也就是现在的移植,仍然不支持FPU。需要在MDK的工程设置里,关闭浮点数单元的使用。如图所示。在没有用户明确提出对FPU进行支持的前提下,EventOS Basic将不会考虑对FPU的支持。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。