Re: What are the __retarget_lock functions?
Thomas Kindler <[email protected]>
| Newsgroups | gmane.comp.lib.newlib |
|---|---|
| Message-ID | <[email protected]> |
Hi! On 10.09.2018 10:53, Freddie Chopin wrote: > On Sun, 2018-09-09 at 10:59 +0200, Thomas Kindler wrote: >> 6. __retarget_lock_init() looks too complicated with the double >> pvPortMalloc/xSemaphoreCreate > > That's because the allocation step is useless. FreeRTOS handle is just > `void*`, you don't need to allocate that, just use `_LOCK_T*` directly. > FreeRTOS objects (with the standard API) are all dynamic anyway > (another very stupid decision). > Unfortunateley, I found no way to get rid of the additional malloc(). Here it is again (slightly updated): https://gist.github.com/thomask77/3a2d54a482c294beec5d87730e163bdd After fiddling around for a long time, I believe, there is no other way to make it work with FreeRTOS' dynamic allocation. The problem is, that newlib uses _LOCK_T in __retarget_lock_acquire with the *address* of __lock___malloc_recursive_mutex. For it to work with dynamic allocation, it would have to use the *value* of __lock___malloc_recursive_mutex. So when implementing __retarget_lock_init, an intermediate pointer is needed (or all of the other functions would need to differentiate between the static __locks and the runtime allocated ones). But maybe I overlooked something? The alternative is to use the static FreeRTOS APIs: https://gist.github.com/thomask77/65591d78070ace68885d3fd05cdebe3a this feels much more natural, and matches the newlib conventions. The drawback is that it pulls in a lot of additional FreeRTOS functions that I don't need anywhere else. best regards, Thomas