VladislavS 39 18 января Опубликовано 18 января · Жалоба 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 хранить одиночные переменные или малые объемы данных - неэффективно. А с чего вы взяли что там одиночная переменная? Ясно же, что пример тестовый, что там реально в куче ХЗ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 83 18 января Опубликовано 18 января · Жалоба А с чего вы взяли, что пример - тестовый? Ясно же, что там в реале может быть такой же реальный 🙂 И вот такая вот залипуха будет случаться при одиночных обращениях (которые будут одиночными даже при чтении массива, но без DMA): Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
blackfin 25 18 января Опубликовано 18 января · Жалоба On 1/18/2024 at 8:08 AM, EdgeAligned said: И вот такая вот залипуха будет случаться при одиночных обращениях (которые будут одиночными даже при чтении массива, но без DMA): А с чего вы решили, что в процессоре с контроллером SDRAM отсутствует КЭШ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 83 18 января Опубликовано 18 января (изменено) · Жалоба А с чего вы решили, что он будет использован каждый раз? 🙂 По сравнению с объемом SDRAM промежуточный кэш на интерфейсе SDRAM прямо-таки мизерный. И в этом случае кешем выступает SRAM микроконтроллера. Изменено 18 января пользователем EdgeAligned Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
blackfin 25 18 января Опубликовано 18 января · Жалоба On 1/18/2024 at 8:27 AM, EdgeAligned said: А с чего вы решили, что он будет стопудово использован каждый раз? Это и не требуется. Существуют статистические оценки попадания в кэш для различных архитектур и размеров кэша. И эти оценки дают вероятность попадания в кэш равную 0,8 ... 0,9. Этого достаточно для большинства приложений. On 1/18/2024 at 8:27 AM, EdgeAligned said: Тут надо иметь именно практическое понимание всей этой работы, а это не у всех развито ... Да, у вас, похоже, не развито.. 😎 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 83 18 января Опубликовано 18 января (изменено) · Жалоба И? Как ваши "статистические попадания" будут попадать.... А, впрочем, почитайте и потренируйтесь работать со SDRAM, потом будете "теоретизировать". А то теоретических рассуждений тут навалом, а на практике мало кто из вас, судя по написанному, нюхал эту SDRAM и разбирается хотябы в RAS/CAS. Для справки: "cpu=Cortex-M4". Это чтоб поменьше растекались на "все случаи в жизни". Изменено 18 января пользователем EdgeAligned Тут всё нормально написано! я сказал Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
blackfin 25 18 января Опубликовано 18 января · Жалоба On 1/18/2024 at 8:44 AM, EdgeAligned said: Для справки: "cpu=Cortex-M4". Какой конкретно Cortex-M4 ? Их сотни разных. И в каком есть SDRAM, но нет кэша? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 18 января Опубликовано 18 января · Жалоба 6 minutes ago, blackfin said: И в каком есть SDRAM, но нет кэша? STM32F4, например. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
blackfin 25 18 января Опубликовано 18 января · Жалоба On 1/18/2024 at 9:03 AM, aaarrr said: STM32F4, например. ОК. Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 12 февраля Опубликовано 12 февраля · Жалоба В 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; } Что именно в таком тривиальном коде вызвало столько вопросов??? Тут скорее всего объявление не переменной, а переменных. Зачем в таком коде индекс у 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: определяется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 12 февраля Опубликовано 12 февраля · Жалоба 19 минут назад, juvf сказал: Соберётся и будет работать. Но это вообще какой-то зашквар. Под case 0: объявляется переменная, а под case 2: определяется. Определяется она под case 0:, а под остальными уже обычные присваивания - инициализация. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться