Let me borrow the picture from JT's article to explain.
In 2073x it allocates some buffers in stack area for stack running (yellow area in the picture).
Calling cfa_mm_Alloc() is to get buffer from pre-allocated buffers in this area.
And calling cfa_mm_MemFreeBytes() in the application is to get remaining available RAM size from user application area (green area in the picture).
In your test code, you are adding cfa_mm_Alloc() to get buffers in the timer routine without free them. So the pre-defined buffers will get run out and system will crash after some time.
I only use it to test the reture value of cfa_mm_MemFreeBytes() whether is credible.
Sorry that I would like to clarify what I said about Calling cfa_mm_Alloc() is to get buffer from pre-allocated buffers in yellow area. Actually it should be in the green area, when I checked the patch/app address and the buffer pointer returned from cfa_mm_Alloc(). It's not in the yellow area.
The buffer obtained by calling cfa_mm_Alloc() is to get one from buffer pool which is initialized when memory init. When you call cfa_mm_MemFreeBytes() in application, it's already well allocated. So obtaining buffer won't affect remaining memory size.
What size is the buffer pool for the cfa_mm_Alloc()? Why initialized it when memory init? Mostly malloc memory use the heap, the heap can use the remain all RAM except stack.
There are few different buffer sizes of the pools which are used for stack, apps and os. They are allocated while system is up. When someone needs buffer, it calls cfa_mm_alloc() to get one from memory management. cfa_mm_Free() is needed to return the buffer after use.
2073x doesn't support heap. Check the link for details.