嵌入式技术论坛
直播中

丁冬芹

7年用户 1256经验值
私信 关注
[问答]

Finsh自定义命令测试完循环执行的函数后能够退出回到终端界面吗

大家好!我们经常会用Finsh自定义一些测试函数,比如下面这样的:

void test_led()
{
led_on();
}
MSH_CMD_EXPORT(test_led, test_led);
在终端输入命令test_led,这个函数执行完了就自动退出了。
但是有的时候,我们需要测试一些需要循环执行的函数,比如这样的:

void test_button()
{
while(1)
{
printf("%d\n", read_button());
rt_mdelay(10);
}
}
MSH_CMD_EXPORT(test_button, test_button);
像这种,一旦在终端执行test_button命令,就无法退出了,只能重启。
不知道大家有没有什么办法,测试完这种循环执行的函数后,能够退出回到终端界面?类似在linux中按ctrl+c,就能中断退出程序
谢谢大家!

回帖(7)

夏日余晖

2022-7-26 11:18:19
这种循环没法通过命令来退出了,在你输入finsh命令进入该循环后,会发现什么命令都输入不了了。循环中加入延时可以不影响其他线程的执行,但是finsh仍然是输入不了任何指令,除非退出该循环。
也没啥好办法,可以通过在循环中加入定时、计数让循环执行一段时间自动退出,或者依据button的值,按下几次就退出。想要主动退出的话,也可以通过自定义finsh命令创建一个按键测试线程,并运行,退出时再通过自定义的finsh命令来删除这个线程。
举报

贾虎世

2022-7-26 11:18:48
定义执行测试函数:

static uint8_t g_test_running = 1;
void test_button()
{
    while(g_test_running)
    {
        printf("%dn", read_button());
        rt_mdelay(10);
    }
}
MSH_CMD_EXPORT(test_button, test_button);
定义退出测试函数:

void test_button_exit()
{
    g_test_running = 0;
}
MSH_CMD_EXPORT(test_button_exit, test_button_exit);
简单实现,试试看?
举报

丁冬芹

2022-7-26 11:19:03
这种方式应该可以,但是不是太好,我们是在终端一直打印按键的状态的同时,输入test_button_exit并回车,如何能直接按ctrl+c把它就直接停了就好了。
举报

马祥

2022-7-26 11:19:18
finsh线程函数是finsh_thread_entry,里面没有定义ctrl+c按键的功能,可以尝试自己定义,另外你的测试函数需要放在单独的线程里面,这样才有可能通过ctrl+c来关闭线程
举报

贾虎世

2022-7-26 11:19:26
要退出它有N种方法,你可以根据你的需求去实现。
举报

杜喜喜

2022-7-26 11:19:37
那就写一个开始测试的,一个结束测试的,然后测试里面while(1)循环记得让出cpu,进行系统调度
举报

王伟

2022-7-26 11:19:43
你可以试试在命令函数中创建一个线程,在线程里面while循环,看看这样能否达到你的需求。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分