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

Porting WizPro to CCS

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



Joined: 17 Jun 2019
Posts: 563
Location: Des Moines, Iowa, USA

View user's profile Send private message Visit poster's website

Porting WizPro to CCS
PostPosted: Wed Mar 31, 2021 11:17 am     Reply with quote

One of the first snags you will hit when porting the WizPro ethernet code over to CCS is how they pass in function pointers. The code works fine on a standard C compiler, but not with the CCS architecture and you get a "Param#1" error like this:

Quote:
*** Error 29 "\PIC\FnPtrTest\FnPtrTest.c" Line 8(26,27): Function definition different from previous definition test_function Param#1


In case it helps others, here is a very simple example showing how to make it work with a minor change to their code (see original commented out).

NOTE: Since I am using typedef to make an UPPERCASE version of what would be their function name, you MUST have "#case" in your project else it will fail due to being non-case sensative.


Code:
#include <24FJ128GA006.h>
#device ICSP=1
#use delay(crystal=20000000)

#FUSES NOWDT                     //No Watch Dog Timer
#FUSES CKSFSM                    //Clock Switching is enabled, fail Safe clock monitor is enabled

#case


Code:

#include <FnPtrTest.h>

// Function pointer defines.
typedef void (*CRS_EN)(void);
typedef void (*CRS_EX)(void);

// Prototypes
// Old
//void test_function ( void(*crs_en)(void), void(*crs_ex)(void) );
// New
void test_function (CRS_EN crs_en, CRS_EX crs_ex);

void crs_en (void);
void crs_ex (void);


// Functions
void crs_en (void)
{
    // Some function
}

void crs_ex (void)
{
    // Some other function
}


//void test_function ( void(*crs_en)(void), void(*crs_ex)(void) )
void test_function (CRS_EN crs_en, CRS_EX crs_ex)
{
    crs_en ();
    crs_ex ();
}


void main()
{
    test_function (crs_en, crs_ex);

    while(TRUE)
    {
        //TODO: User Code
    }

}


It's not a pretty example, but hopefully gives someone else a quick start. Basically, instead of:

void test_function ( void(*crs_en)(void), void(*crs_ex)(void) );

...which will not compile, you make a typedef for each function (technically you just need one for each "type" based on the params and return type, but making a separate one makes the code read cleaner). I chose the same name but in UPPERCASE:

typedef void (*CRS_EN)(void);
typedef void (*CRS_EX)(void);

...and then change the function from the original with the fPtr inside the params to use the typedef:

void test_function (CRS_EN crs_en, CRS_EX crs_ex);

Good luck!
_________________
Allen C. Huffman, Sub-Etha Software (est. 1990) http://www.subethasoftware.com
Embedded C, Arduino, MSP430, ESP8266/32, BASIC Stamp and PIC24 programmer.
http://www.whywouldyouwanttodothat.com ?
allenhuffman



Joined: 17 Jun 2019
Posts: 563
Location: Des Moines, Iowa, USA

View user's profile Send private message Visit poster's website

PostPosted: Fri Apr 16, 2021 9:33 am     Reply with quote

We completed our Wizpro I/O library port to CCS, and above were really the main changes to their code we needed to make.

Beyond that, it was just setting up the function to do slave select toggle, and wrappers for the SPI I/O.

We are not using the calls that pass in functions as parameters -- instead, just adding them to a config table so they are there on startup.

We have made it Common code so we only make small mods to one file that then includes the rest, and we are using it on two different PIC24 boards right now.
_________________
Allen C. Huffman, Sub-Etha Software (est. 1990) http://www.subethasoftware.com
Embedded C, Arduino, MSP430, ESP8266/32, BASIC Stamp and PIC24 programmer.
http://www.whywouldyouwanttodothat.com ?
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