I am developing on a Kinetis K60 and on MQX3.8 I was successfully using _cortex_int_init() to call my ISR handler on a port edge interrupt. Now that I have to use MQX4, it doesn't compile as there's no definition in <cortex.h>. I tried _bsp_int_init() but that gets translated to _nvic_int_init(), which the compiler can find in <nvic.h> but the linker can't! All I can find in <cortex.h> is _psp_int_init(), but I've no idea if that's equivalent or what the arguements are?
Can anyone help?
I have exactly the same problem as Oliver but I use the _cortex_int_init() to call the isr handler on a FTM interrupt.
In my psp.a I have no occurence of "nvic_int_init" but the function _nvic_int_init() works.
I you want I can share my code but it's only demo code.
Hello Guillaume Tiffineau,
where is nvic_int_init linked from ? You alleged it works but you have same problem, which confused me. What are you having difficulties with?
If you can share your demo code, it could be useful.
Regards,
c0170
Hello,
Sorry for my english. I think that some misunderstanding can come from this.
I said that I have the same problem because when I transfered my project to use the mqx4.0, I had a lot of error with the function _cortex_int_init(). But I tried to replace it with the _nvic_int_init() function and it worked perfectly.
I fact I did'nt found the nvic_int_init in the psp.a file because I done a mistake. But now I found it.
for the code.
In my include I have
#include <mqx.h>
#include <bsp.h>
#include <lwevent.h>
#include <FTM_PDD.h>
And Here is the code that I use
void Quad_Config(_QUAD QuadNumber, int_16 Resolution, boolean EnableInterrupt)
{
FTM_MemMapPtr PeripheralBase;
PeripheralBase = Quad_GetPeripheral(QuadNumber);
if(PeripheralBase != NULL)
{
if(QuadNumber == QUAD_1)
{
SIM_SCGC6 |= SIM_SCGC6_FTM1_MASK;
}
else if (QuadNumber == QUAD_2)
{
SIM_SCGC3 |= SIM_SCGC3_FTM2_MASK;
}
if(EnableInterrupt == TRUE)
{
FTM_PDD_EnableOverflowInterrupt(PeripheralBase);
}
FTM_PDD_WriteFeaturesModeReg(PeripheralBase, 1);
FTM_PDD_WriteConfigurationReg(PeripheralBase, 96);
FTM_PDD_WriteModuloReg(PeripheralBase, Resolution);
FTM_PDD_InitializeCounter(PeripheralBase);
FTM_PDD_WriteQuadratureDecoderReg(PeripheralBase, 1);
if(QuadNumber == QUAD_1)
{
FTM1_SC |= FTM_SC_CLKS(1);
PORTA_PCR(8) = PORT_PCR_MUX(6);
PORTA_PCR(9) = PORT_PCR_MUX(6);
if(EnableInterrupt == TRUE)
{
FTM_PDD_EnableOverflowInterrupt(PeripheralBase);
_int_install_isr(INT_FTM1, (void(_CODE_PTR_)(pointer))Quad_irq_callback, (void *)1);
_nvic_int_init(INT_FTM1, 4, TRUE);
// _cortex_int_init(INT_FTM1, 4, TRUE);
}
}
else if (QuadNumber == QUAD_2)
{
FTM2_SC |= FTM_SC_CLKS(1);
PORTB_PCR(18) = PORT_PCR_MUX(6);
PORTB_PCR(19) = PORT_PCR_MUX(6);
if(EnableInterrupt == TRUE)
{
FTM_PDD_EnableOverflowInterrupt(PeripheralBase);
_int_install_isr(INT_FTM2, (void(_CODE_PTR_)(pointer))Quad_irq_callback, (void *)2);
// _cortex_int_init(INT_FTM2, 4, TRUE);
_nvic_int_init(INT_FTM2, 4, TRUE);
}
}
}
}
I put the complete project in attachement.
I don't know if it will help you.
Regards.
your TestRtos project doesn't build, because it has wrong paths to MQX libraries. In MQX 4.0, the paths to libraries have changed. For example from:
"${MQX_ROOT_DIR}/lib/twrk60f120m.cw10/bsp"
to
"${MQX_ROOT_DIR}/lib/twrk60f120m.cw10/debug/bsp"
and
"psp_twrk60f120m_d.a"
changed to
"psp.a"
so if I change all the paths to include "debug" in it (including path to the .lcf file), your project builds without any problem.
By the way, _cortex_int_init() from previous MQX releases should be replaced by _bsp_int_init()
change from:
_cortex_int_init(INT_TSI0, 4, TRUE);
change to:
_bsp_int_init(INT_TSI0, 4, 0, TRUE);
on ARM Cortex M4 targets that would translate to _nvic_init_init().
1)
check that nvic_int_init is in your psp.a. for example my psp.a is in this folder:
c:\Freescale\Freescale_MQX_4_0\lib\twrk60d100m.cw10\debug\psp\psp.a
and if you open in text mode and search for the string "nvic_int_init" it has multiple references.
if the psp.a has the nvic_int_init function object code, move on to 2)
2)
check the settings of the linker in your application.
It should be configured to look for additional object code from
${MQX_ROOT_DIR}\lib\twrk60d100m.cw10\debug\psp
psp.a
is the name of the library.
MQX_ROOT_DIR = c:\Freescale\Freescale_MQX_4_0 (your MQX 4.0 installation folder)
There are 8 occurences of the string nvic_int_init in my psp.a
I'm using IAR so I added the c:\freescale.......\debug\psp\psp.a file to the 'Additional libraries: (one per line)' text box of the linker tab but I still get:
Error[Li005]: no definition for "_nvic_int_init(unsigned long, unsigned long, unsigned long)"
Hello Oliver Sedlacek,
please drag the library to your project. I created a couple of projects which had Additional libraries empty, a library file (*.a) was part of the project as code/header files. Does linker find the definition then?
Regards,
c0170
psp.a is part of the project but the linker still can't find _nvic_int_init :smileysad:
Oliver, can you post here your project ? I will try to build it on my PC. I guess you don't want to share your proprietary code, but if you could delete some confidential parts of your application to a bare minimum (like hello world), just to reproduce the issue on my side.
OK, so thanks to efforts from by software buddy I can report that the reason why the linker couldn't link to _bsp_int_init despite it being in bsp.a was due to C++ name mangling. Obvious when you know.
"OK, so thanks to efforts from by software buddy I can report that the reason why the linker couldn't link to _bsp_int_init despite it being in bsp.a was due to C++ name mangling. Obvious when you know."
Ok but how did you resolve it anyway ? How did you resolve the C++ name mangling ?
As the _bsp_int_init() function is in a C function library, you need to tell the linker to expect an unmangled name. You can do this as follows:
#ifdef __cplusplus
extern "C" {
#endif
#include "some c file headers"
#ifdef __cplusplus
}
#endif
Thank you :-)
You just made my day :-)
It`s working now.
I'll have to ask whether I'm allowed to do that...