основы STM32 - переменные.

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
wiskas
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вс дек 19, 2010 23:10:20

основы STM32 - переменные.

Сообщение wiskas »

Доброго времени суток. Приобрел я себе stm32vldiscovery. Вот обучаюсь по немногу. И как всегда возникают элементарные вопросы, которые к сожелению в интернете не найти (я не нашел, может моё зрение 0.6 - это и есть причина ;)
Вообщем так получается. Пользуюсь keil, проект создал, светодиодиком мигать научился, но лучше знание по контроллеру не приобретешь, пока не полезешь в основы. На Си создаю переменную в самом начале:

Код: Выделить всё

#include "stm32f10x.h"
unsigned char flag=0;
unsigned char flag2=4;
unsigned char flag3=2;
поже меняю её значение:

Код: Выделить всё

while(1)
	{
      flag=1;
      flag2=1;
      flag3=1;
      flag2=10;
      flag3=13;
и смотрю что творит дебагер в асм коде:

Код: Выделить всё

    33:       flag=1; 
0x0800020A 2001      MOVS     r0,#0x01
0x0800020C 491C      LDR      r1,[pc,#112]  ; @0x08000280
0x0800020E 7008      STRB     r0,[r1,#0x00]
    34:       flag2=1; 
0x08000210 491C      LDR      r1,[pc,#112]  ; @0x08000284
0x08000212 7008      STRB     r0,[r1,#0x00]
    35:       flag3=1; 
0x08000214 491C      LDR      r1,[pc,#112]  ; @0x08000288
0x08000216 7008      STRB     r0,[r1,#0x00]
    36:       flag2=10; 
0x08000218 200A      MOVS     r0,#0x0A
0x0800021A 491A      LDR      r1,[pc,#104]  ; @0x08000284
0x0800021C 7008      STRB     r0,[r1,#0x00]
В итоге понимаю что переменная flag хранится по адрессу 0x08000280 (PC=0x0800020C + #112).
То есть сразу же после программного кода который начинается от 0x08000000 адресса флеша.\

Так вот вопрос: переменная размещается за кодом программы сразу, во флеше, а флеш программы энергонезависимый и как я понимаю имеет ограниченный рессурс записи/чтения. Следовательно, если очень часто менять переменную, то ячейка флеша загнеться? и МК будет негожий?

Если да, то какая альтернатива хранения перемменых?
Реклама
Аватара пользователя
koyodza
Собутыльник Кота
Сообщения: 2623
Зарегистрирован: Вс июл 17, 2011 11:51:52
Контактная информация:

Re: основы STM32 - переменные.

Сообщение koyodza »

Там не переменная хранится, а её адрес. Этот адрес загружается в регистр R1, и потом адрессация ОЗУ происходит по регистру R1
Кстати, просто так записать во флеш Вы не сможете, там нужны сложные процедуры разрешения и запрета записи, а сама запись возможна только данными по 16 бит, и только обнуление битов. Для установки битов в единицу нужно стирать всю страницу, процедура стирания ещё сложнее, чем записи
Реклама
wiskas
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вс дек 19, 2010 23:10:20

Re: основы STM32 - переменные.

Сообщение wiskas »

знач я могу не волноваться о переменных)) эт а как мона посмотреть куда пишит оно переменную озу? точнее узнать адресс записаный по PC+#104
Аватара пользователя
koyodza
Собутыльник Кота
Сообщения: 2623
Зарегистрирован: Вс июл 17, 2011 11:51:52
Контактная информация:

Re: основы STM32 - переменные.

Сообщение koyodza »

Смотря какой средой программирования Вы пользуетесь Не заметил, что указан кейл.
Но смысла в этом не очень много, линкер может менять размещение переменных по своему усмотрению. Если начинаете программировать на С, не нужно сразу глубоко лезть в ассемблер, активнее пользуйтесь окном Watch в которое можно помещать непосредственно переменные. В режиме отладки идите в меню View -> Watch Window, потом туда можете забивать или перетаскивать имена переменных (структур и массивов тоже можно) и просматривайте их содержимое там.
При включенной оптимизации локальные переменные могут размещаться в регистрах, тогда их не будет видно в Watch
Ещё есть View -> Call Stack Window, там видны локальные переменные
Последний раз редактировалось koyodza Пт июл 13, 2012 10:46:36, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
YurBoc
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вт июл 10, 2012 12:19:14
Откуда: Москва
Контактная информация:

Re: основы STM32 - переменные.

Сообщение YurBoc »

wiskas, пролистайте окно с ассемблерным кодом вниз, до 0x8000280.
Не знаю как в Keil, а в IAR даже в ассемблерном коде подставляется имя переменной:

Код: Выделить всё

0x80000b0: 0x20000004     DC32      flag
(в моём случае в регистр с адресом записалось 0x80000b0)
Реклама
Kolbaskin_Kirov
Родился
Сообщения: 11
Зарегистрирован: Вс мар 06, 2016 19:12:38

Re: основы STM32 - переменные.

Сообщение Kolbaskin_Kirov »

Добрый день. Не могу понять поведение KEIL. В начале программы пытаюсь в RAM инициализировать три переменных. RAM начинается с адреса 0x20000000. По идее, исходя из скаттер файла, кейл должен положить эти переменные начиная с вышеприведенного адреса. Но в самом начале идет какой-то мусор и соответственно эти константы он кладет после. При считывании адреса переменной, адрес начинается как положено с 0х20000000
Реклама
Ответить

Вернуться в «ARM»