Use of malloc with Keil compiler

Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
AlVa_264671
Level 5
Level 5
25 sign-ins First like given First like received

Hi every one !

   

I would need help using malloc() library function.

   

I would need to create a fuction in C  that take an Array like argument , procces that array  and return a pointer to an array which is the product of the function's procces.

   

I have tried using  function like   uint8 *Function_X ( uint8 &Arg_ Array[ ] );  like declaration and.....

   

something like this as definition;

   

  uint8 * Function_X( uint8 & Arg_Array[0 ] ) {

   

 satic uint8 Array_1[[16];

   

                              fuction body

   

                           return (array_1);

   

}

   

 

   

The caller function  is something like this:

   

 

   

In the file that call  " uint8  * Function_X ( uint8 & ASrg_Array[ ] )  " ,   I declare a pointer let say  "uint8 Ptr."

   

 

   

When I call the function is something like this assuming that I want to process  uint8 Payload [16]:

   

   Ptr= Funtion_X ( & Payload[0] );

   

 

   

Afterward I espect transfer the product of the process through the pointer Ptr, but I can't find the 16 element of the processed array . 

   

That's why  I am trying to use other method  like malloc.

   

But the keil compiller declare like mandatory to call  init mempool previously  and up to this point reach my knowledge.

   

 

   

Can someone else help me with that ?

   

Thank all of you for your time for help me

0 Likes
9 Replies
Bob_Marlowe
Level 10
Level 10
First like given 50 questions asked 10 questions asked

You have to call initmempool() and provide a pointer to a data-area and the size of the data-area for malloc() to use.

   

you may use a function construct as

   

uint8 * MyFunction(uint8 * Array);

   

When you want MyFunction() to know about the size of Array you will have to provide it as a second parameter.

   

 

   

Bob

0 Likes
Anonymous
Not applicable

in your function

   

uint8  * Function_X ( uint8 & ASrg_Array[ ] )

   

as you said you are passing the pointer of a int8,  so when you go into the function, creator would not know it is pointing to an array. So it would not be shown.

0 Likes
ETRO_SSN583
Level 9
Level 9
250 likes received 100 sign-ins 5 likes given

Maybe I am confused, does this not pass the address to the first element

   

in the array, ASrg_Array, to the function ? A pointer ?

   


   

uint8  * Function_X ( uint8 & ASrg_Array[ ] )

   


   

Regards, Dana.

0 Likes
AlVa_264671
Level 5
Level 5
25 sign-ins First like given First like received

Thank you very much Bob, HL and Dana  for those  helpful suggestions.

   

Sorry I made ​​a typo in the following sentence;

   

   

In the file that call  " uint8  * Function_X ( uint8 & ASrg_Array[ ] )  " ,   I declare a pointer let say  "uint8 Ptr."

   

  At the end of the sentence should say  Uint8 *Ptr  not Uint8  Ptr; in other words a pointer is been declared.

   

 

   

But my question now is : How many times can I use  initmempool() and malloc() because I need to call functions like Function_X declared in two .c file. On the other hand the caller funcion  is definited in different .c file .

   

May be the following clarify my question;

   

 

   

main()  -----> call Fucnction _Caller1   and    Fucnction _Caller2

   

File_1.c  --->    Fucnction _Caller1  is   calling  to  Function_X1

   

File_2 .c  ---->   Fucnction _Caller2  is    calling   to  Function_X2

   

File _3.c  -->  definition of  Function_X1

   

File_4.c ----->  definition of  Function_X2

   

and every .c file has its own .h file

   

Whit the above scheme, where and how many times I should declare and define   initmempool() and malloc()

   

 

   

Again  thank all of you in advance.

0 Likes
Bob_Marlowe
Level 10
Level 10
First like given 50 questions asked 10 questions asked

InitMempool should be called only once (in the initialization part of your project). It tells the malloc-system how much memory shall be managed by the memory-manager.

   

You may call malloc() as often as you like, but you should test the received pointer for nonzero which would otherwise indicate a failure which is usually out-of-memory.

   

Do not forget to free() memory chunks that are no longer needed so that they can be returned to the memory-pool and re-used.

   

There is no restriction of which function calls which at which level, as long as you do not blow the stack by creating too-deep recursions. The stack is 256 Bytes deep and is solely used for the return-addresses.

   

 

   

Bob

0 Likes
AlVa_264671
Level 5
Level 5
25 sign-ins First like given First like received

Bob.!   Thank you so much for the answer

   

I wil try and let see what happend.

   

Have a great day.!

0 Likes
AlVa_264671
Level 5
Level 5
25 sign-ins First like given First like received

Hi Bob, HL an Dana!!! Thank you very much for your help.

   

The first test I am doing using malloc() seems to be fine.

   

I got  information from other place about use Static varaible for function that receive arrays like argument and return pointers but I verified that doesn't work  for any  function in our hardware platform ( PSoC3), evidently using malloc() was the solution.

   

I am developing an encoder and decoder for a RF link, and I developed code  from the begining with Code Block, because in the first step it was all about software.  Using Code Block every function like I mentioned in my first post was implemented with static variable. The system which has two file, an Encoder and a Decoder  was tested separately  for simulating the RF link.

   


But I've forgotten I was working with a Core I5  in my laptop........ but  this is only a comentary for  fiend people like you  who have help me.

   

 

   

 

   

Thanks all of you again.

0 Likes
AlVa_264671
Level 5
Level 5
25 sign-ins First like given First like received

Hi My friends again!!!!

   

 

   

Suddently  I tried to debbug one of the .c files who has been workinf find so far,  and the compiler send me a messagee about it does not find source file and shows dissameble fiiles.

   

The  source file is there, in the work space explorer, I can see it, but the debbug ends up in the Dissaembly file.

   

Thank you in advance.

0 Likes
Bob_Marlowe
Level 10
Level 10
First like given 50 questions asked 10 questions asked

Alex, it would be better to create a new thread for a new problem.

   

Usually the .c files reside in the project directory, did you place some of them into a different path?

   

 

   

Bob

0 Likes