Таки плюсы и constexpr В библиотеку
template <typename T, size_t SIZE>
struct FLASH_LIST
{
template<typename U>
struct TNODE
{
U data;
TNODE *next;
};
template <typename F>
constexpr FLASH_LIST(F f)
{
size_t i{};
for(auto& x:node)
{
x.next = &node[i<(SIZE-1)?(i+1):0];
x.data = f(i++);
}
}
TNODE<T> node[SIZE]{};
};
Использование в программе
struct DATA
{
uint32_t x;
};
constexpr FLASH_LIST<DATA,40> list(
[](uint32_t n)
{
return DATA { n*n };
});
int main()
{
auto *p = &list.node[0];
for(;;)
{
GPIOA->IDR=p->data.x;
p=p->next;
}
}
Листинг
//int main()
//{
// auto *p = &list.node[0];
main:
LDR.N R0,??DataTable1
LDR.N R1,??DataTable1_1
// for(;;)
// {
// GPIOA->IDR=p->data.x;
??main_0:
LDR R2,[R0, #+0]
STR R2,[R1, #+0]
// p=p->next;
LDR R0,[R0, #+4]
B.N ??main_0
// }
//}
SECTION `.rodata`:CONST:REORDER:ROOT(2)
DATA
list:
DATA32
DC32 0, list + 0x8, 1, list + 0x10, 4, list + 0x18, 9, list + 0x20, 16
DC32 list + 0x28, 25, list + 0x30, 36, list + 0x38, 49, list + 0x40, 64
DC32 list + 0x48, 81, list + 0x50, 100, list + 0x58, 121, list + 0x60
DC32 144, list + 0x68, 169, list + 0x70, 196, list + 0x78, 225
DC32 list + 0x80, 256, list + 0x88, 289, list + 0x90, 324, list + 0x98
DC32 361, list + 0xa0, 400, list + 0xa8, 441, list + 0xb0, 484
DC32 list + 0xb8, 529, list + 0xc0, 576, list + 0xc8, 625, list + 0xd0
DC32 676, list + 0xd8, 729, list + 0xe0, 784, list + 0xe8, 841
DC32 list + 0xf0, 900, list + 0xf8, 961, list + 0x100, 1'024
DC32 list + 0x108, 1'089, list + 0x110, 1'156, list + 0x118, 1'225
DC32 list + 0x120, 1'296, list + 0x128, 1'369, list + 0x130, 1'444
DC32 list + 0x138, 1'521, list