ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
23 июля
1205009 Топик полностью
VladislavS. (02.05.2022 10:06, просмотров: 255) ответил Mahagam на блеать. если первое требование - равномерность подачи данных, то в текущем прерывании готовим данные для отправки в следующем. сохраняем их в заготовленную переменную и в самом начале следующего прерывания отправляем куда там требуется. в этом случае можно вообще нихрена не хранить, а считать на лету.
Для полноты картины посмотрим листинг и этого варианта. За сдвиг записи полезных данных на одну команду к началу прерывания платим дополнительной переменной в SRAM и более длинным прерыванием: 
void SysTick_Handler()
{   
  static auto node = list.node[0];  
  GPIOA->IDR=node.data.x;
  node=*node.next;
}


//void SysTick_Handler()
//{   
//  static auto node = list.node[0];  
//  GPIOA->IDR=node.data.x;
SysTick_Handler:
        LDR      R2,??DataTable1_3   // Чтение из FLASH адреса node     (1)
        LDR      R0,[R2, #+0]        // Чтение из SRAM node.x           (2)
        LDR      R1,??DataTable1_4   // Чтение из FLASH адреса IDR
        STR      R0,[R1, #+0]        // Запись data в IDR
//  node=*node.next;
        LDR      R0,[R2, #+4]        // Чтение из SRAM node.next        (3)
        LDM      R0,{R0,R1}          // Чтение из FLASH следующего node (4,5)
        STM      R2!,{R0,R1}         // Запись в SRAM следующего node   (6,7)
//}
        BX       LR