我需要帮助来清除我的概念。 我有一个功能,可以在每秒后打开/关闭Led状态。现在开/关的代码在infite循环内运行。
示例:
void ToggleLed( int pin_number)
{
// some code
while(1)
{
// code to execute the Led status
}
}
现在,当我将此代码与基线集成并在其他函数中调用该函数时,它就无法正常工作。
问题:函数具有无限循环,并且它不会失控,并且在该函数不起作用之后调用的其他函数也是如此。 如果是这种情况,我需要提供单独的线程吗?
任何建议都会有所帮助。
答案 0 :(得分:2)
是的,您将需要一个单独的线程或其他形式的异步执行。进入while循环后,该线程中不会运行其他代码。如初。
答案 1 :(得分:1)
如果我理解,您的集成版本中没有任何效果。在这种情况下,是的,您可能需要在单独的线程上运行无限循环,因为具有infinit循环的函数将永远不会退出,因此在该线程上不会运行任何其他代码。
答案 2 :(得分:1)
你没有说什么操作系统,但是,是的,将它设置为低优先级线程,最小堆栈大小。我在我的项目中刷了一个LED,这样我就可以很容易地看到代码是否已经到达中止处理程序了:))
void LEDflash_task_code(void *p)
{
while (1)
{
FIO1CLR=STATUS_LED;
OSsleep(750);
FIO1SET=STATUS_LED;
OSsleep(250);
};
};
答案 3 :(得分:1)
如果您可以访问硬件外围设备定时器(任何微控制器/微处理器应用程序),您应该使用那些硬件定时器,而不是线程或软件睡眠()。
void init_toggle_led (uint32_t interval)
{
setup_hardware_timer(interval);
}
void toggle_led (void)
{
if( (hardware_timer_register & flag) > 0 )
{
port = port ^ pin_mask;
}
}
main()
{
init_toggle_led(1000);
for(;;)
{
do_stuff();
toggle_led();
}
}
这是民意调查的一个例子。或者,您可以使用来自定时器的硬件中断并从那里切换端口。
答案 4 :(得分:0)
正如大卫所说,你应该在一个单独的线程中运行你的LED代码。 http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html#BASICS
一旦你有线程,如果你希望你的代码能够阻止你的LED闪烁,那么在每次迭代时添加一个在while循环内检查的标志,如果它已经设置然后爆发。
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
void * toggle_led(void *ptr);
int stop=0;
int main (int argc, const char * argv[])
{
printf("Hello, World!\n");
// set up thread
pthread_t LED_thread;
char * message = "blink!";
pthread_create( &LED_thread, NULL, toggle_led, (void*) message);
// do some other work
sleep(5);
// ok you want to quit now
stop=1;
pthread_join(LED_thread, NULL);
printf("Goodbye!\n");
return 0;
}
void *toggle_led(void *ptr)
{
while (!stop)
{
printf("%s \n", (char *)ptr);
sleep(1);
}
}
答案 5 :(得分:0)
我认为你需要实现看门狗功能。因为如果你使用线程,那么即使其他线程有一些问题(比如死锁),只要toggle_led
线程工作,你的LED就会切换。您需要实现toggle_led()
函数并在返回之前从其他每个线程/函数调用以确保所有其他线程/函数成功执行而无需持续等待某些资源