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

есть такая ф-ция

char *ToLower(char *str)
{
  int i;
  for(i = 0; i < strlen(str); i++)
  {
      if(str[i]>='A' && str[i]<='Z')
       str[i]=str[i]+32;
  }
  return str;
}

когда передаю переменную в качестве аргумента во всех контролерах работает без проблем.

ToLower(some_string);

когда передаю константную строку в качестве аргумента

ToLower("WRITE");

в контролерах с внутренней флеш памятью работает без проблем. а в контролерах с внешней флеш памятью (по крайней мере в NXP) компайлер помещает строку во флеш и я соответсвенно получаю 

void MemManage_Handler(void)
{ 
  while(1) {}
}

можно как то какой нибудь прагмой объяснить компайлеру чтоб помещал строку в RAM?

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

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


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

char str[] = "WRITE";

ToLower(str);

3 минуты назад, jenya7 сказал:

в контролерах с внутренней флеш памятью работает без проблем

Недоговариваете что-то, ибо работать будет, разве что, только в AVR и подобных.

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


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

On 12/6/2023 at 10:08 AM, Arlleex said:

char str[] = "WRITE";

 

это не указатель на константу? компилятор выделит переменную в RAM?

On 12/6/2023 at 10:08 AM, Arlleex said:

Недоговариваете что-то, ибо работать будет, разве что, только в AVR и подобных.

 

почему нет? во всех кортексах работает. и не только.

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


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

2 минуты назад, jenya7 сказал:

это не указатель на константу? компилятор выделит переменную в RAM?

Ага.

Цитата

почему нет? во всех кортексах работает. и не только.

Неа. Разве только что если код из ОЗУ запускается...

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


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

23 minutes ago, jenya7 said:

компайлер помещает строку во флеш

Компилятор ничего не помещает в память, т.к. это удел линковщика. Но и он подчиняется писанным законам - скрипту. В первую очередь разбирайтесь с ним)

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


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

On 12/6/2023 at 10:25 AM, Arlleex said:

Ага.

Неа. Разве только что если код из ОЗУ запускается...

не знаю. у нас все проекты прожигаются во флеш, по крайней мере наш код. в RAM алоцируются только системные функции.

 

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

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


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

2 минуты назад, jenya7 сказал:

не знаю. у нас все проекты прожигаются во флеш

И я не знаю, но приведенный код в том виде, в каком показан - не корректен.

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


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

On 12/6/2023 at 10:33 AM, Arlleex said:

И я не знаю, но приведенный код в том виде, в каком показан - не корректен.

тут нужно объясниться. в нормальном мире такое не может произойти. но у нас один кадр написал парсер на сотни строк в таком виде

if(strcmp(ToLower(args[1]), ToLower("WRITE")) == 0)

ему видите ли так удобно. я не уследил и это художество гуляет уже в нескольких проектах. но работает. а в новом камне с внешней флеш памятью вылезла проблема.

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

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


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

Значит никогда не работало правильно. Либо результат оптимизации, но сомнительно.

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


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

2 минуты назад, jenya7 сказал:

 это художество это гуляет уже в нескольких проектах. но работает. а в новом камне с внешней флеш памятью вылезла проблема.

Оно может работать только когда строка расположена в ОЗУ. Ваша функция ToLower меняет исходную строку. Строку во флэш невозможно изменить. Обращение на запись к внутренней флэш обычно игнорируется а к внешней - возможны варианты, например исключение.

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


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

Налицо проблема неполного понимания работы инструментария:

1. В какую память и что помещается.

2. Как, даже если строка и укладывается в ro-память, она может меняться? Тут хотя бы в дизассемблер заглянуть надо. Или в листинг функции.

7 minutes ago, _3m said:

запись к внутренней флэш обычно игнорируется

Только не на ARM))) HF или иное исключение шины гарантированно.

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


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

Всё. Когда мат иссяк пошёл посмотрел старые проекты - он там всё переделал. В новом проекте он уже забыл об этом. Извиняюсь за это насилие над коллективным разумом.

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

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


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

On 12/6/2023 at 11:25 AM, Arlleex said:

Ага.

Неа. Разве только что если код из ОЗУ запускается...

Почему ?
У кортекса мосты между ОЗУ и ПЗУ и все будет прекрасно работать.
Сам на кортексах посмотянно printf использую и все замечательно работает.

printf("bla-bla-bla\r\n");

Чем это отличается от того, что привел ТС ?
 

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


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

В 06.12.2023 в 13:21, dimka76 сказал:
printf("bla-bla-bla\r\n");

Чем это отличается от того, что привел ТС ?
 

Тем, что у вас нет функции, которая пытается изменить "bla-bla-bla\r\n" по указателю

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


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

On 12/6/2023 at 1:26 PM, MrYuran said:

Тем, что у вас нет функции, которая пытается изменить "bla-bla-bla\r\n" по указателю

Точно, я на это внимания не обратил.

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


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

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

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

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

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

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

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

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

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

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