We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hi I am implement a project on the microsemi cortex M3 ARM with the RTX OS and the TCP stack.
I have spend hours reading through posts on the forum and web about implementing no_semihosting and the retarget.c file. I do understand what semihosting is trying to do and why a retarget.c file is needed.
But I have not found an answer or idea about how to resolve the one remaining linker error I am getting.
Error: L6915E: Library reports error: __use_no_semihosting_swi was requested, but _sys_open was referenced
I have been trying figure out what is referencing _sys_open. It is already defined in io_sys.o so I cannot add it to my retarget.c file.
I have removed all references to printf() and there are none to open().
I have run out of ideas as how to remove the offending reference. I'm guessing that it is coming from a library function, maybe.
I know this topic has been brought up over and over again but I just could not find a answer/clue to this specific sys_open reference. I was able to resolve all of the others.
Does anyone have an ideas as to where I could look or what I could to to resolve this one? :-)
The target.c/serial.c is trying to tailor console io to your specific hardware, on a Cortex-M3/4 I'd be tempted to push it out the ITM (SWV/SWO Serial Wire Viewer channel) absent a serial port. USART are vendor specific, not part of the core, and presumably the OS isn't providing console or file system functionality.
How it works with RTX, I don't know, you could GREP the files you're pulling in, and those in the library directory.
Check also for putchar/getchar/puts etc.
You are correct RTX is not providing a console. Microsemi's fpga design tool creates a keil project with a retarget.c file which is a good place to start.
It uses their uart driver for i/o which is fine. I have search the code for any reference to fopen() to resolve what is referencing _sys_open
I was looking at the map as well and it looks like malloc might be referencing fopen(). If it is, then that is going to be a problem to replace it with one that does not call the C library function fopen().
I don't understand why malloc which I am using for heap management would use fopen() though.
fopen.o(.text) refers to h1_alloc_mt.o(.text) for malloc fopen.o(.text) refers to fclose.o(.text) for _fclose_internal fopen.o(.text) refers to sys_io.o(.text) for _sys_open fopen.o(.text) refers to fseek.o(.text) for _fseek fopen.o(.text) refers to rt_memclr_w.o(.text) for __aeabi_memclr4 fopen.o(.text) refers to stdio_streams.o(.bss) for __stdin
malloc() doesn't call fopen(). It's some logic in fopen() that makes use of malloc(). Probably to allocate a buffer and possibly also some state information.
Ok that makes sense. I was just trying to use the map to somehow track down the fopen user.
I just when through my code and commented out stdio.h and recompiled to hopefully cause a undefined function error to see if there is something I missed.
They only two functions to be undefined were snprintf and sscanf for string manipulation.
I really am out of ideas right now as to how to find what is referencing fopen (aka sys_open)
Do you have any ideas about how to expose the statement?