I have recently started working with MQX 4.2 on K64F. I use Keil uVision 5 to build my application on top of the IEEE 1588 demo project. I need a very tightly timed position control for which I use the PIT module (1ms period), however, installing a regular ISR gave me a relatively large activation jitter. I found instructions on how to use a kernel ISR instead (I had to recompile MQX with MQX_ROM_VECTORS set to 0). The jitter in activation time of the ISR reduced greatly, but now the board is acting differently.
When I compile/load my project with:
_int_install_isr (INT_PIT0, PIT_IRQHandler, 0);
everything is OK, and I can reset the board multiple times and see the same code running every time.
When I compile/load my project with:
_int_install_kernel_isr (INT_PIT0, PIT_IRQHandler);
after the load finishes, I restart the board and the code runs. However, if I restart the board, no code is being run anymore until I perform another load.
Does anyone have an idea why this is happening and how to overcome this? I would really have to use kernel ISRs for my application.
Thank you very much.
已解决! 转到解答。
Hi Vuk:
I don't understand "after the load finishes, I restart the board and the code runs. However, if I restart the board, no code is being run anymore until I perform another load.". Do you mean the code can't run if restart the board? you need to perform another load ?If this is the case, I think it is a normal behavior, because the vector table is in RAM, the stored information is lost if power is removed.
_int_install_kernel_isr can be used only if the vectors are in RAM. You can also install the user kernel_isr when MQX_ROM_VECTORS is set, but then you cann't use the _int_install_kernel_isr function, you need to modify the ROM vector table itself, as it resides in the flash in this configuration
mqx/source/bsp/frdmk64f/vectors.c
You can have a try, hope it helps.
Regards
Daniel
Hi Vuk:
I don't understand "after the load finishes, I restart the board and the code runs. However, if I restart the board, no code is being run anymore until I perform another load.". Do you mean the code can't run if restart the board? you need to perform another load ?If this is the case, I think it is a normal behavior, because the vector table is in RAM, the stored information is lost if power is removed.
_int_install_kernel_isr can be used only if the vectors are in RAM. You can also install the user kernel_isr when MQX_ROM_VECTORS is set, but then you cann't use the _int_install_kernel_isr function, you need to modify the ROM vector table itself, as it resides in the flash in this configuration
mqx/source/bsp/frdmk64f/vectors.c
You can have a try, hope it helps.
Regards
Daniel
Hello Daniel,
Thank you very much for a prompt response. I was not aware that MQX_ROM_VECTORS set to 0 will not allow the created binary file to be runnable anytime.
Could you point me to any documents to help with customizing the vector table?
Thank you very much!
Daniel,
I am still having trouble with this. So, I have modified the vector table in vector.c as in these screenshots:
Additionally, in one of the single-shot tasks, I call:
_int_install_kernel_isr (INT_PIT0, interpolationPeriodRoutine);
_bsp_int_init ((IRQInterruptIndex)INT_PIT0, 0, 0, TRUE);
But this does not give me the ability to run my application after restarting the board. If I remove the call to _int_install_kernel_isr, and leave only _bsp_int_init, then my ISR never gets activated, which makes me think that I am not modifying the vector table correctly. I should probably note that I do rebuild MQX projects after changing anything in the vector.c file. Could you please point out what am I doing wrong?
Thank you very much for your help.
Daniel,
Thank you very much for your efforts. I have the default vector table and I used to have several tasks that initialize the peripherals that I need. When I converged all that code into one task, even though nothing significant was really changed, my problem got fixed somehow. So, just putting all initialization into one task fixed my issue. I am not sure why this is the case, but this solved the issue.
Thank you for helping around this issue.
Hi Vuk Lesi:
Sorry for the late response.
I double checked your questions. I have some doubts about your results. The _int_install_kernel_isr can work well if I reboot the devices. Why your result is fail after reboot? _int_install_kernel_isr can be used only if the vectors are in RAM. You need to place this code in user_config.h and rebuild the bsp and psp libraries.
#define MQX_ROM_VECTORS 0
Though the vector is in RAM, it will disappear after power lost, it will reinstall the kernel isr to RAM after reboot. Sorry maybe I didn't explain it clearly in my last reply.
I did a quick test with _int_install_kernel_isr on TWR-K60D100M board, and the result is OK. I attached my code.
Regards
Daniel
Daniel,
Thank you very much for your help. I use the fromelf image converter to produce a .bin file at the end of building my project, which I copy to the flash memory of K64F.
Thank you for the screenshot. I suppose I should supply the name of my ISR for ivINT_PIT0, not ivINT_Hard_Fault. However, I also need to set the NVIC correctly, besides manually changing the vector table, right? I have tried just calling _bsp_int_init((IRQInterruptIndex)INT_PIT0,1,0,TRUE); but that does not work. Could you please explain what else do I need to do besides defining my ISR and adding its name to the vector table?
Thank you very much for your time.