Me gustaría compartir el siguiente código en el que estuve trabajando ayer con CCS RTOS. Este codigo se puede utilizar para pasar un valor float con las funciones rtos_msg_send(task, byte).
Recordar que el parámetro que se puede pasar con la función anteriormente mencionada es de 1 byte y un dato tipo float ocupa 4 bytes por lo que hay que separarlo para enviarlo de una tarea a otra. La forma como lo enfoque fue mediante punteros y un ciclo for.
En la tarea que estará enviando el dato, en alguna parte tendrán que añadir el siguiente código:
void tarea_q_envia_dato()
unsigned int8 i, *y;
float valor_ms_ADC_f;
#locate valor_float = 0x0214 ///el número 0x214 fue arbitrario, puede ser cualquiera dentro del rango de RAM disponible para el pic
.
.
.
código en cuestión
.
.
.
valor_float= f(x) ////// Represente a f(x) como cualquier asignación, función o procedimiento y donde se guarda el valor con punto flotante
y=&valor_float;
for(i = 0; i < 4; ++i){
rtos_msg_send(tarea_que_recibe_dato,*y);
*y=*y++;
}
Luego, en la funcion de llegada, implementé el siguiente código:
void tarea_que_recibe_dato(){
unsigned int8 i, z, *y;
float var_retorno;
#locate pot_msegs = 0x0218
if(rtos_msg_poll()>0){ ///me cercioro que hayan datos en la cola de msjs
y = &var_retorno;
for(i = 0; i < 4; ++i)
{
z = rtos_msg_read();
*y=z;
*y = *y++;
}
Y eso, intente de varias formas pero de esa manera pude enviar un dato tipo float de una tarea a otra. Quizas otra forma que le veo es tomar directamente el dato desde la dirección de RAM que asigné en la tarea de envio del dato float y me ahorro ram y código. Pero me sirvió mas de forma didáctica, espero depurar el código cuando tenga más tiempo y así mostrar mas opciones.
Cualquier ayuda lo agradecería como ya va siendo costumbre en este foro, he aprendido mucho gracias a ustedes ;D