Перейти к содержанию
    

Стили оформления программ на C/C++ и их применимость

1 час назад, razrab83 сказал:

которая инитится в main

У меня для совместимости с разными компиляторами (тулчейнами) вот такая конструкция используется

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __ICCARM__
  int __low_level_init(void)
#else
  void SystemInit()
#endif
{

  // Код инициализации железа

#ifdef __ICCARM__
  return 1;
#endif
}

#ifdef __cplusplus
}
#endif

 

35 минут назад, EdgeAligned сказал:

Во внешней SDRAM хранить одиночные переменные или малые объемы данных - неэффективно.

А с чего вы взяли что там одиночная переменная? Ясно же, что пример тестовый, что там реально в куче ХЗ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А с чего вы взяли, что пример - тестовый? Ясно же, что там в реале может быть такой же реальный 🙂 И вот такая вот залипуха будет случаться при одиночных обращениях (которые будут одиночными даже при чтении массива, но без DMA):

pic_04.gif

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 1/18/2024 at 8:08 AM, EdgeAligned said:

И вот такая вот залипуха будет случаться при одиночных обращениях (которые будут одиночными даже при чтении массива, но без DMA):

А с чего вы решили, что в процессоре с контроллером SDRAM отсутствует КЭШ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А с чего вы решили, что он будет использован каждый раз? 🙂 По сравнению с объемом SDRAM промежуточный кэш на интерфейсе SDRAM прямо-таки мизерный. И в этом случае кешем выступает SRAM микроконтроллера. 

Изменено пользователем EdgeAligned

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 1/18/2024 at 8:27 AM, EdgeAligned said:

А с чего вы решили, что он будет стопудово использован каждый раз?

Это и не требуется. Существуют статистические оценки попадания в кэш для различных архитектур и размеров кэша. И эти оценки дают вероятность попадания в кэш равную 0,8 ... 0,9.

Этого достаточно для большинства приложений.

On 1/18/2024 at 8:27 AM, EdgeAligned said:

Тут надо иметь именно практическое понимание всей этой работы, а это не у всех развито ...

Да, у вас, похоже, не развито.. 😎

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И? Как ваши "статистические попадания" будут попадать.... А, впрочем, почитайте и потренируйтесь работать со SDRAM, потом будете "теоретизировать". А то теоретических рассуждений тут навалом, а на практике мало кто из вас, судя по написанному, нюхал эту SDRAM и разбирается хотябы в RAS/CAS. 

Для справки: "cpu=Cortex-M4". Это чтоб поменьше растекались на "все случаи в жизни". 

 

Изменено пользователем EdgeAligned
Тут всё нормально написано! я сказал

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 1/18/2024 at 8:44 AM, EdgeAligned said:

Для справки: "cpu=Cortex-M4".

Какой конкретно Cortex-M4 ? Их сотни разных. И в каком есть SDRAM, но нет кэша?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 02.01.2024 в 13:53, jcxz сказал:

Странно... не думал, что здесь так много не умеющих написать примитивное объявление переменной.... 

int Tst1(int a, int *p)
{
  int r = -1;
  switch (a) {
    case 0:
      int i0;
      i0 = p[0];
      r = a + i0;
      break;
    case 1:
      int i1;
      i1 = p[1];
      r = a * i1;
      break;
    case 2:
      int i2;
      i2 = p[2];
      r = a << i2;
  }
  return r;
}

Что именно в таком тривиальном коде вызвало столько вопросов???   :scratch_one-s_head:

Тут скорее всего объявление не переменной, а переменных.

Зачем в таком коде индекс у i? С логической точки зрения кода, что делается в case 1: 

- объявляется переменная i

- определяется значением р[1]

- Вычисляется r = a*i;

С точки зрения читаемости кода индекс не нужен. Попробуйте собрать так

int Tst1(int a, int *p)
{
  int r = -1;
  switch (a) {
    case 0:
      int i;
      i = p[0];
      r = a + i;
      break;
    case 1:
      int i;
      i = p[1];
      r = a * i;
      break;
    case 2:
      int i;
      i = p[2];
      r = a << i;
      break;
  }
  return r;
}

Получите ошибку:     Error[Pe101]: "i" has already been declared in the current scope. Скобочки решают эту проблему. Можно конечно без скобок и без индексов так сделать

int Tst1(int a, int *p)
{
  int r = -1;
  switch (a) {
    case 0:
      int i;
      i = p[0];
      r = a + i;
      break;
    case 1:
      i = p[1];
      r = a * i;
      break;
    case 2:
      i = p[2];
      r = a << i;
      break;
  }
  return r;
}

Соберётся и будет работать. Но это вообще какой-то зашквар. Под case 0: объявляется переменная, а под case 2: определяется. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 минут назад, juvf сказал:

Соберётся и будет работать. Но это вообще какой-то зашквар. Под case 0: объявляется переменная, а под case 2: определяется. 

Определяется она под case 0:, а под остальными уже обычные присваивания - инициализация.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...