We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
This is my source code, very simple.
#include <rtx51.h> #include <stdio.h> #include <math.h> #include <REGX51.H> void task1 (void) _task_ 1 _priority_ 1 { P2_1 = 0; os_wait(K_TMO, 100, 0); } void task2 (void) _task_ 2 { P2_1 = 1; os_wait(K_TMO, 100, 0); } void start (void) _task_ 0 { os_set_slice(10000); os_create_task (1); os_create_task (2); os_delete_task (os_running_task_id ()); P1=0; } void main (void) { P2_3=0; os_start_system (0); }
But when i use proteus to simulator this program, I see that : P2_3 is low, that ok. But P1 is always high. I think that the program doesn't run the funtion :void start (void) _task_ 0 . But I don't know why. Can you help me. Thank you very much.
First off - your program does not contain any loop. The function task1() and task2() immediatelly returns. Was that intended?
Next thing - the task "start" calls os_delete_task(os_running_task_id()); Wouldn't that kill this task before it gets time to run the following line?
Thank you for your help! I fixed my code like your advice:
#include <rtx51.h> #include <stdio.h> #include <math.h> #include <REGX51.H> void task1 (void) _task_ 1 _priority_ 1 { while(1){ P2_1 = 0; os_wait(K_TMO, 100, 0); } } void task2 (void) _task_ 2 { while(1){ P2_1 = 1; os_wait(K_TMO, 100, 0); } } void start (void) _task_ 0 { P1=0; os_set_slice(1000); os_create_task (1); os_create_task (2); os_delete_task (0); } void main (void) { P2_3=0; os_start_system (0); }
But the result doesn't change. Help me, please! Thanks very much!
what do you need
os_delete_task (0);
for ?
I mean, are you sure this call does not have unforeseen consequences? what happens if you remove it...?
and, why do you create your tasks in a task that is later terminated - is it not better to call
os_set_slice(1000); os_create_task (1); os_create_task (2);
in main?
maybe your task 0 is killed along with its side effects (spawning new tasks...)?
Thanks for your help. First I think os_start_system() is compel. I delete it and call os_create_task (2); in main but nothing happen.
I try applying your advice but nothing change. I need your help. Thanks very much.
are you using your own scheduler? what is the RTOS you are using?
I use RTX51 Full with KeilC. I thinks this program is so simple. But.... I don't known why it doesn't run.
do you be trying the run to the simulator and you be stepping the steps?
z.i.k. try not with proteous me thinked is good.
I don't know if there is a difference between RTX51 Full and RTX51 Tiny.
The Tiny manual says: http://www.keil.com/support/man/docs/tr51/tr51_guidelines.htm
"Do not create a main C function. RTX51 Tiny has its own main function." I guess this isn't relevant, since the Tiny version doesn't document a os_start_system() call.
"Task functions must never exit or return."
You must examine your documentation if your task start() is allowed to end by falling past the end brace.
You must also examine your documentation if the main() function may return, or if os_start_system() is a function that never returns.
In the ARM version of the compiler, main() is all
This is my lastest code:
#include <rtx51.h> #include <stdio.h> #include <math.h> #include <REGX51.H> void task1 (void) _task_ 1 _priority_ 1 { while(1){ P2_2 = 0; os_wait(K_TMO, 1000, 0); } } void task2 (void) _task_ 2 { while(1){ P2_4 = 1; os_wait(K_TMO, 100, 0); } } void main (void) { P2_3=0; os_set_slice(10000); os_create_task (1); os_create_task (2); P2_3=1; }
Then, I debug it by KeilC. First, P2_3 is low. Then I see the program finish running these function : os_set_slice(10000); os_create_task (1); os_create_task (2); After that, P2_3 is high. But then I see the program repeat the main() function (P2_3 is low....) . So , I can't understand what happen.
Can you give a simple example which well operated? Thanks very much!
how about placing an infinite loop in your main as well...? I think your processor resets! is such a loop not required when using RTX?
I don't understand what you mean about "an infinite loop". My program is repeated the main() function infinite times. Maybe be my processor reseted. But why? "a loop not required when using RTX" ? Can you explain clearer? Thanks a lot!
My guess is that the function os_start_system() in RTX51 does a similar thing as the os_sys_init() function in the ARM version of RTX.
The manual says "The os_sys_init function does not return."
If you let main() return, then it is up to the startup code to decide what will happen - if main will be restarted, the processor will be reset (leading to main being called again), the program getting stuck in an infinite loop after end of main(), ...
In short - consider it undefined behaviour what happens if you leave mai(), and make sure that it doesn't happen.
void main (void) { P2_3=0; os_set_slice(10000); os_create_task (1); os_create_task (2); P2_3=1; while(1) { // hang here } ; }