CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

RTOS_Disable() & RTOS Enable()

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
waheed



Joined: 19 May 2012
Posts: 26
Location: Pakistan

View user's profile Send private message

RTOS_Disable() & RTOS Enable()
PostPosted: Tue May 22, 2012 12:36 am     Reply with quote

Controller: PIC 18f452

How to use these Functions? Info Provided in the CCS Manual is insufficient.

I have tried using it in a RTOS Task like this:
Code:

#task (rate=100us, max=50us)
void read_adc()
{
float32 Volts;

count++;
adc_value = read_adc();
Volts = (float32)adc_value*3000;
Volts = Volts/1024;
Volts_add = Volts_add + Volts;
Volts_final= Volts_add/(float32)count;

}

#task (rate=100us, max=20us)
if (count==100)
{
RTOS_Enable(LCD_Update);
}
void LCD_Update()
{
count=0;
Volts_add=0;
dt_lcd_gotoxy(0,4);
printf(dt_lcd_printchar"Voltage = %fmV            ",Volts_final); /* send to LCD*/
dt_lcd_gotoxy(0,3);
printf(dt_lcd_printchar,"Bits = %Lu            ",bits);
sq_value=(sqrt(Volts_final)/100)*2.235;
dt_lcd_gotoxy(0,5);
printf(dt_lcd_printchar,"Sq. Vol. = %f        ",sq_value);
dt_lcd_gotoxy(0,6);
printf(dt_lcd_printchar,"PWM1 = %f%% ",PWM1_duty);
dt_lcd_gotoxy(0,7);
printf(dt_lcd_printchar,"PWM2 = %f%% ",PWM2_duty);
}



What I wanted this program to do is, read the value of ADC 100 times, takes the average and enables LCD_Update Task.

But it gives error that the following part needs declaration:
Code:

if (count==100)
{
RTOS_Enable(LCD_Update);
}
Ttelmah



Joined: 11 Mar 2010
Posts: 19520

View user's profile Send private message

PostPosted: Tue May 22, 2012 1:23 am     Reply with quote

You would....
A function needs to be declared _before_ you can reference it. You need to create a function prototype for the LCD_Update function _before_ you try to reference it.
Separately, is the section 'if (count==100)' a function?. It has to be to be used by #task, and isn't as you show it.

Best Wishes
waheed



Joined: 19 May 2012
Posts: 26
Location: Pakistan

View user's profile Send private message

PostPosted: Tue May 22, 2012 3:15 am     Reply with quote

I have tried doing it this way. But it still gives error:
"Undefined identifier LCD_Update"

Code:

#task (rate=100us, max= 50us)

void LCD_Enable()
{
if (count==1024)
   {
   rtos_enable(LCD_update);
   }
}


void LCD_update()
{
count=0;
Volts_add=0;
dt_lcd_gotoxy(0,4);
printf(dt_lcd_printchar"Voltage = %fmV            ",Volts); /* send to LCD*/
dt_lcd_gotoxy(0,3);
printf(dt_lcd_printchar,"Bits = %Lu            ",bits);
sq_value=(sqrt(Volts)/100)*2.235;
dt_lcd_gotoxy(0,5);
printf(dt_lcd_printchar,"Sq. Vol. = %f        ",sq_value);
dt_lcd_gotoxy(0,6);
printf(dt_lcd_printchar,"PWM1 = %f%% ",PWM1_duty);
dt_lcd_gotoxy(0,7);
printf(dt_lcd_printchar,"PWM2 = %f%% ",PWM2_duty);
}

void LCD_Disable()
{
rtos_disable(LCD_update);
}
Ttelmah



Joined: 11 Mar 2010
Posts: 19520

View user's profile Send private message

PostPosted: Tue May 22, 2012 6:41 am     Reply with quote

_As I said_.

"A function needs to be declared _before_ you can reference it. You need to create a function prototype for the LCD_Update function _before_ you try to reference it."

Still applies.
waheed



Joined: 19 May 2012
Posts: 26
Location: Pakistan

View user's profile Send private message

PostPosted: Tue May 22, 2012 10:29 pm     Reply with quote

Dear Ttelmah,

Will you please elaborate a little.

Should LCD_Update function be outside the task?

All Function are Enabled by default. Is there any way to Disable a specific task before the execution of rtos?

If I write LCD_Update before the LCD_Enable function, then LCD_Update task will run first and then how can I control it _ provided that all task are enabled by default...
Mike Walne



Joined: 19 Feb 2004
Posts: 1785
Location: Boston Spa UK

View user's profile Send private message

PostPosted: Wed May 23, 2012 3:04 am     Reply with quote

I think you've got a 'C' issue NOT an RTOS one.

Have you got a line like this, near the the top of your code, with all the other prototypes in ALL relevant files?
Code:

void LCD_update();

I know CCS is not entirely consistent about this, and often the compiler accepts code without prototypes.


Why not include count test as part of the LCD_update() task?
Code:

void LCD_update()
{
  if (count==100)
  {
   .... rest of LCD_update code as is
  }
}


Simply do the test, ignore the bulk of the code if the test fails.

That way you don't have to worry about enabling and disabling the task.

You've got three different values that you're testing count for; 100, 1000, 1024 sprinkled through your code snippets. I'm assuming that you know what you're final intention is.

Mike
waheed



Joined: 19 May 2012
Posts: 26
Location: Pakistan

View user's profile Send private message

PostPosted: Wed May 23, 2012 4:15 am     Reply with quote

Quote:

Have you got a line like this, near the the top of your code, with all the other prototypes in ALL relevant files?
Code:

void LCD_update();




No, I haven't written a line like this. Should I include this?

Quote:

Why not include count test as part of the LCD_update() task?
Code:

void LCD_update()
{
  if (count==100)
  {
   .... rest of LCD_update code as is
  }
}




I have already tried this. This works fine, just trying to figure out how the RTOS _Enable() & RTOS_Disable() function work.


Quote:

You've got three different values that you're testing count for; 100, 1000, 1024 sprinkled through your code snippets. I'm assuming that you know what you're final intention is.


I was just testing the code and didn't care for the values. By the way, the value, I am going to use is 1024.
ckielstra



Joined: 18 Mar 2004
Posts: 3680
Location: The Netherlands

View user's profile Send private message

PostPosted: Wed May 23, 2012 5:24 am     Reply with quote

waheed wrote:
Quote:

Have you got a line like this, near the the top of your code, with all the other prototypes in ALL relevant files?
Code:

void LCD_update();




No, I haven't written a line like this. Should I include this?
Get back to your C study book and look up the difference between a 'function definition' and a 'function declaration'.
It is a little bit confusing but this is such basic C knowledge that I'm not going to repeat what is in every textbook. Just remember that before you can use a function the compiler has to 'know' what the input and output parameters are. So when processing your source files the compiler will go through it top to bottom and when it comes to an unknown function it will stop instead of being smart and scan through the rest of the file to find the unknown function. So it is up to you, as a programmer, to make sure the function name is known before it is being used.
Ttelmah



Joined: 11 Mar 2010
Posts: 19520

View user's profile Send private message

PostPosted: Wed May 23, 2012 8:48 am     Reply with quote

Mike Walne wrote:

I know CCS is not entirely consistent about this, and often the compiler accepts code without prototypes.

Mike


Actually, I think this is one area, where CCS, sticks _exactly_ to the letter of C.
You must _either_ have a declaration, or a definition before the function is used. A definition, implicitly creates a declaration, if one does not already exist, so if you have the definition, before using the routine, a further declaration is not required. Types used in declarations and definitions must match (this is an ANSI requirement not in C originally).

Best Wishes
Mike Walne



Joined: 19 Feb 2004
Posts: 1785
Location: Boston Spa UK

View user's profile Send private message

PostPosted: Wed May 23, 2012 11:10 am     Reply with quote

Thanks Ttelmah, you've cleared up a confusion in my mind.

I'm relatively new to 'C', and learn something every day.

So this code compiles OK without a prototype
Code:
//     Prototypes
#include <18F452.h>

void test_function() {}

void main()
{
while (1)  { test_function(); }
}


And this doesn't.
Code:
//     Prototypes
#include <18F452.h>

void main()
{
while (1)  { test_function(); }
}

void test_function() {}


I thought it was CCS not being strict.

Thanks again.

Mike
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group