16 ms·
I mostly allocate static areas in the BSS segment. That way, I know at compile time that I allocated my memory correctly, assuming that I have my stack under co
by larve 4y ago
I mostly allocate static areas in the BSS segment. That way, I know at compile time that I allocated my memory correctly, assuming that I have my stack under control.
Then I follow my two rules of embedded development:
- no recursion
- everything has to be O(1)
If I'm honest, I can't remember a project where I had to use even a pool allocator, which you would usually need if you were trying to do like, reorderable queues / lists / trees or so. I right now can't come up with a proper use case. If you do need to say, compute a variable length sequence of actions based on an incoming packet, then I would structure my code so that:
a) only the current action and the next action get computed (so that there is no pause in between executing them)
b) compute the next action when I switch over (basically with a ping-pong buffer)
c) verify real-time invariants
My most used structure is the ring buffer to smooth out "semi-realtime" stuff, and if the ring buffer overflows, well, the ring buffer overflows and it has to be dealt with. If I could have more memory I would just make the ring buffer bigger.
I'm not sure how clear this explanation is :)
- ctrlmeta 4y ago> I mostly allocate static areas in the BSS segment. How is this done from C code? Any code examples someone can point me to?
- larve 4y agoHonestly just a global char foobar[256] = {0};
- deleted 4y ago[deleted]
- flyingfences 4y agoIt's not done in the code itself, it's done in the compiler configuration. We specify a mapping of memory ranges (based on the hardware and how we want to use it) and the compiler assigns addresses to variables within those ranges as appropriate. gcc calls these files "linker scripts", armcc "scatter files" -- those are the keywords to look up for examples and documentation.
- zen_1 4y agoBSS is the section of your program's address space where all the un/zero-initialized memory lives, so just a global std::array<u64, 1024> foo{}; would be placed in BSS by the compiler. BSS is also usually not included in the actual executable size (as it's marked as NOLOAD in the linkerscript), and needs to be zero-initialized by the C runtime if you want to guarantee that . https://en.wikipedia.org/wiki/.bss https://en.wikipedia.org/wiki/.bss