« hrt_call_every » don't work above 1ms

If I dont put while(1) I doen’t do anything because the app is returning 1 and get out of the main :confused:

And I thought in a the task code we always put the code into a while loop;

I try to create its own thread but It’s still does nothing

__EXPORT int debug_main(int argc, char *argv[]);
int debug_thread_main(int argc, char *argv[]);
int todo(int argc, char *argv[]);


int debug_main(int argc, char *argv[])
{	
	px4_task_spawn_cmd("debug",
						 SCHED_DEFAULT,
						 SCHED_PRIORITY_DEFAULT,
						 2000,
						 debug_thread_main,
						 (char * const *)&argv[0]);
			
	return 1;
}
int debug_thread_main(int argc, char *argv[]){
	
	struct hrt_call call;
	struct timespec ts;
	
	ts.tv_sec = 0;
	ts.tv_nsec = 1000000; //1msec
	
	hrt_call_every(	&call,
					ts_to_abstime(&ts),
					ts_to_abstime(&ts),
					(hrt_callout)todo,
					NULL);
					
	return 1;
}
int todo(int argc, char *argv[]){
	
	PX4_INFO("Was done !");
	return 1;
}

And this also doesn’t work:

static bool thread_should_exit = false;		/**< daemon exit flag */
static bool thread_running = false;		/**< daemon status flag */
static int daemon_task;				/**< Handle of daemon task / thread */

__EXPORT int debug_main(int argc, char *argv[]);
int debug_thread_main(int argc, char *argv[]);
int todo(int argc, char *argv[]);
static void usage(const char *reason);

void
usage(const char *reason)
{
	if (reason) {
		warnx("%s\n", reason);
	}

	warnx("usage: daemon {start|stop|status} [-p <additional params>]\n\n");
}
int debug_main(int argc, char *argv[])
{	
		if (argc < 2) {
		usage("missing command");
		return 1;
	}

	if (!strcmp(argv[1], "start")) {

		if (thread_running) {
			warnx("daemon already running\n");
			/* this is not an error */
			return 0;
		}

		thread_should_exit = false;
		daemon_task = px4_task_spawn_cmd("debug",
						 SCHED_DEFAULT,
						 SCHED_PRIORITY_DEFAULT,
						 2000,
						 debug_thread_main,
						 (argv) ? (char *const *)&argv[2] : (char *const *)NULL);
		return 0;
	}

	if (!strcmp(argv[1], "stop")) {
		thread_should_exit = true;
		return 0;
	}

	if (!strcmp(argv[1], "status")) {
		if (thread_running) {
			warnx("\trunning\n");

		} else {
			warnx("\tnot started\n");
		}

		return 0;
	}

	usage("unrecognized command");
	return 1;
}
int debug_thread_main(int argc, char *argv[]){
	
	struct hrt_call call;
	struct timespec ts;
	
	thread_running = true;
	
	ts.tv_sec = 0;
	ts.tv_nsec = 1000000; //1msec
	
	while (!thread_should_exit) {
		
	hrt_call_every(	&call,
				ts_to_abstime(&ts),
				ts_to_abstime(&ts),
				(hrt_callout)todo,
				NULL);
	}		warnx("[daemon] exiting.\n");
	
	thread_running = false;		
	return 0;
}
int todo(int argc, char *argv[]){
	
	PX4_INFO("Was done !");
	return 1;
}