question 1: This is the original reset handler that is in the startup file (*.s)
Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT SystemInit IMPORT __main LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 ENDP
which i modify to
Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT SystemInit IMPORT OSInit IMPORT __main LDR R0, =SystemInit BLX R0 LDR R0, =OSInit BLX R0 LDR R0, =__main BX R0 ENDP
Here the OSInit is a function. This works fine.
But when i modify the original to following, I get a hard fault.
Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT SystemInit IMPORT main IMPORT OSInit LDR R0, =SystemInit BLX R0 LDR R0, =main BLX R0 ;getting hardfault here LDR R0, =OSInit BX R0 ENDP
Irrespective of whether the OSInit is a function or a task, i get Hardfault.
question 2: does the '__' (two underscores) before 'main' have any significance. Because when i write __OSInit, the compiler is unable to locate OSInit function (Error L6218E: undefined symbol). but for '__main' the function name is always 'main' and compiler locates it.
Note that code normally is written based on a number of assumptions. You are breaking these assumptions when you try to do things differently. Why assumptions... This ain't gonna work, OK It should.
Why we dont have a RTOS in which the user only has to design only an executable file and run it (just as in desktop OS)?
Let us think in this direction... We dont have RTOS where, we can only patch up the new code on to the device already running. We have to load the whole code. (increases the service cost for the company as it has to regulate site visits. site visits are avoidable if i have an ethernet based boot-loader, then too i have to flash the whole code!!) Like for example, an application on my mobile-phone has a new update. the application gets updated without switching off the phone or for that matter even the application.
also the coders from all around the world can develop the applications.
similarly, my colleagues dont have to bother what is going on (eg: about the interrupt functions and data generated from there. they just have the locations [or mailboxes or any other method] form where they get the values captured in the interrupt functions). they have the starting point and they just have to start from there.
Hence i need some more initialization before main.
Why assumptions?
Because you can't design _anything_ without making assumptions.
What assumptions did a car manufacturer base the design on? - that people can buy gasoline? - that there exists tire companies? - that a human will sit with the legs down and the arms on the steering wheel? - that the customers will value safety and expect safety belt, air bags, impact zones, ... - that the customer would be angry if the noise levels did give loss of hearing. - that a normal road doesn't have holes larger than a certain size. - what size to expect for a normal parking space.
There are always assumptions.
Some are so obvious that you don't document them. S the car is designed for humans of "normal" size. The manufacturer leaves it up to people who are 270 cm long or weights 340 kg to check if they will fit.
Some are non-obvious and needs to be documented. So you get a document that tells the maximum weight you may transport with the car. And which specific fuel it can run on.
For majority of code written, the code is written under the assumption that someone else have already set up the processor stack. And all global variables have been given their intended start values.
If you play with the startup file, then you invalidate these design decisions, and ends up with a non-working program.
Agreed, that there must be some assumptions. But the altering the designs is also allowed. Like there are cars with engine behind the drivers seat. so i just want to shift engine behind.
i have a start up file in which SystemInit function is not called from asm.
Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT __main LDR R0, =__main BX R0 ENDP
the asm only has __main. and then, i borrowed this new file from cmsis library where it has SystemInit function called from the asm code.
main is just a name for the tool. it must allow initialisation of os before we call main. no?
It can do nothing to disallow it. However, you must appreciate what __main does. One task is to initialise memory and the data it is expected to hold. It sets up the C runtime environment prior to main being called. A lot of the RTX is written in C. It makes use of the C facilities. You seem to be suggesting, therefore, that C should be used before the C runtime is actually permitted.
View all questions in Keil forum