ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
22 июля
1204004 Топик полностью
VladislavS. (29.04.2022 08:59, просмотров: 384) ответил Moлoдoй кoллeгa на Односвязный список инициализируется в цикле и всё с этим хорошо. Решил положить этот список во флеш ибо ОЗУ всего 2K. 40 элементов списка я устану заполнять ручками. Есть варианты "автоматизации" инициализации массива структур при обьявлении? Можно препроцессор как-то использовать?
Таки плюсы и 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