Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于在shellTask任务中添加延时,释放CPU占用,让空闲任务得到执行 #182

Open
github-linux opened this issue Mar 6, 2024 · 4 comments

Comments

@github-linux
Copy link

Hi NevermindZZT 大佬好
在下面这个代码中,如果使用rtos则是一个while(1)的死循环,如果rtos中还有一个空闲任务,优先级比这个任务优先级低,则永远得不到执行
void shellTask(void *param)
{
Shell *shell = (Shell *)param;
char data;
#if SHELL_TASK_WHILE == 1
while(1)
{
#endif
if (shell->read && shell->read(&data, 1) == 1)
{
shellHandler(shell, data);
}
#if SHELL_TASK_WHILE == 1
}
#endif
}

大佬是否考虑添加一个delay,用于释放CPU资源;
例如在配置文件中加一个宏定义 #define SHELL_DELAY() vTaskDealy( (5) / portTICK_PERIOD_MS )
void shellTask(void *param)
{
Shell *shell = (Shell *)param;
char data;
#if SHELL_TASK_WHILE == 1
while(1)
{
#endif
if (shell->read && shell->read(&data, 1) == 1)
{
shellHandler(shell, data);
}
#if SHELL_TASK_WHILE == 1
SHELL_DELAY();
}
#endif
}

@NevermindZZT
Copy link
Owner

这个设计是期望实现的 shell->read 接口中,有进行操作系统的任务调度
MCU 上使用串口一般实现是在串口中断中发送信号量,在 read 中等待信号量,当有串口数据过来的时候就会调度进 shellTask,没有数据就会将任务挂起
可以看看 esp-idf 的 demo, 里面实现的 read 接口就是调用了 esp-idf 中阻塞接受的函数,是会有任务调度的

@github-linux
Copy link
Author

感谢回复,这个我看了在esp32中是没问题的,但是好多底层驱动设计的和RTOS完全解耦了;
比如串口中断接受的数据写入一个ringbuf中,而RTOS需要数据是调用uart_read()从ringbuf中去取出来的,所以可能uart_read接口只是从ringbuf中获取数据,没有等待信号量等操作,从而导致不会进行任务调度

@NevermindZZT
Copy link
Owner

感谢回复,这个我看了在esp32中是没问题的,但是好多底层驱动设计的和RTOS完全解耦了; 比如串口中断接受的数据写入一个ringbuf中,而RTOS需要数据是调用uart_read()从ringbuf中去取出来的,所以可能uart_read接口只是从ringbuf中获取数据,没有等待信号量等操作,从而导致不会进行任务调度

这种情况就可以在实现的 shell->read 接口中进行任务调度,就比如说最简单的加 sleep,就可以放在 shell->read 的实现中

@github-linux
Copy link
Author

了解了,那我就先在uart_isr和uart_read中添加一个钩子函数吧,一个用于发送信号量和等待信号量操作,尽量降低驱动和rtos耦合吧

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants