Например TDA7294

Форум РадиоКот • Просмотр темы - STM32 новичку в ARM что к чему
Форум РадиоКот
Здесь можно немножко помяукать :)



Текущее время: Пт июл 19, 2019 18:10:24

Часовой пояс: UTC + 3 часа [ Летнее время ]


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 5587 ]     ... , , , 273, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Вт апр 09, 2019 22:37:55 
Вымогатель припоя
Аватар пользователя

Карма: 3
Рейтинг сообщений: 18
Зарегистрирован: Вт окт 23, 2012 14:17:25
Сообщений: 500
Откуда: Киселевск
Рейтинг сообщения: 0
1. Data ZI: нулевые инициализированные данные

2. Data RO - это константы.
Общий объем RAM память = Data RW + Data ZI
Общий размер FLASH память = Code + Data RO + Data RW

3. Некоторые константы (Data RO) генерируются компилятором / компоновщиком и также могут быть добавлены из библиотек. Таким образом, они будут существовать независимо от того, что ваша программа явно не определяет какие-либо константы.

_________________
Инженер R@D

Жизнь начинаешь понимать тогда когда кончается здоровье


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Ср апр 10, 2019 06:24:31 
Вымогатель припоя
Аватар пользователя

Карма: 10
Рейтинг сообщений: 66
Зарегистрирован: Вт май 01, 2018 20:44:47
Сообщений: 622
Рейтинг сообщения: 0
На пустом проекте реально занято 1632 байт озу?
Про стек и кучу не забываем.

Может я, по не знанию, что то не то подключил? Или это не ОЗУ?
Ответы на все вопросы есть в .map файле. Не ленитесь в него заглядывать.


Вернуться наверх
 
JLCPCB, всего $2 за прототип печатной платы! Цвет - любой!

Отличное качество, подтвержденное более чем 600,000 пользователей! Более 10,000 заказов в день.

Зарегистрируйтесь и получите два купона по 5$ каждый:https://jlcpcb.com/quote

Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Ср апр 10, 2019 08:24:48 
Первый раз сказал Мяу!

Зарегистрирован: Сб янв 24, 2015 22:07:59
Сообщений: 20
Рейтинг сообщения: 0
Спасибо! Разобрался, оказывается на стек и кучу ушло.
Код:
      Code (inc. data)   RO Data    RW Data    ZI Data      Debug   Object Name
        64         26        236          0       1536        804   startup_stm32f10x_ld.o
Stack_Size      EQU     0x00000400
Heap_Size       EQU     0x00000200
Еще один вопрос, на stm32 предпочтительно надо использовать 32 битные переменные? Это увеличит скорость по сравнению с переменными 8 и 16 бит? Хочу перенести проект с меги на стм, переделал так, что бы функции возвращали 32 битные значения, все локальные переменные тоже 32 бита. Но вот глобальные переменные, отъедающие ОЗУ, жаба душит объявлять 32 битными.


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $88 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Ср апр 10, 2019 12:06:18 
Вымогатель припоя
Аватар пользователя

Карма: 10
Рейтинг сообщений: 66
Зарегистрирован: Вт май 01, 2018 20:44:47
Сообщений: 622
Рейтинг сообщения: 0
Что вы потом будете делать с сэкономленной памятью? Солить?

Преждевременная оптимизация — корень всех (или большинства) проблем в программировании. (с) Дональд Кнут.


Вернуться наверх
 
Плавкие предохранители LittelFuse. Грамотный подбор

Выбор оптимального плавкого предохранителя требует учета многих параметров. Для упрощения выбора оптимального предохранителя и автоматизации расчетов Littelfuse предлагает онлайн-утилиту. Подробнее>>
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Ср апр 10, 2019 12:13:37 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1418
Зарегистрирован: Чт дек 28, 2006 09:19:56
Сообщений: 13691
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
VladislavS писал(а):
Солить?
бинго!!! :))) :beer:

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
удивительно, но при взгляде на многих сверху ничего не меняется...


Вернуться наверх
 
Немногим дороже дискретного решения: новое поколение импульсных стабилизаторов Mornsun

Практически во всех радиоэлектронных устройствах массово применяются линейные понижающие стабилизаторы напряжения типа КРЕН в корпусе TO220 (другое обозначение – 78хх) и им подобные для формирования основного напряжения питания схемы.
Данные стабилизаторы позволяют без особых затрат получить нужное для каскада или узла схемы напряжение, если устройство питается от внешнего источника с более высоким напряжением. Для этого требуются… Подробнее>>
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Ср апр 10, 2019 12:53:56 
Первый раз сказал Мяу!

Зарегистрирован: Сб янв 24, 2015 22:07:59
Сообщений: 20
Рейтинг сообщения: 0
Я большей части спрашивал, в каких переменных работать в STM32. Понизит ли скорость работы с 8битными переменными, например в цикле for(uint8_t j=0;j<50;++j) или же здесь предпочтительно писать uint32_t j. Просто по коду, иногда с uint8_t компилируются меньше по размеру, отсюда сомнения что uint32_t всегда правильно. Сейчас у меня 4к оперативы, в текущем проекте RO-data=17610 RW-data=424 ZI-data=3816 И я засуетился :)))


Вернуться наверх
 


Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Ср апр 10, 2019 13:08:12 
Вымогатель припоя
Аватар пользователя

Карма: 10
Рейтинг сообщений: 66
Зарегистрирован: Вт май 01, 2018 20:44:47
Сообщений: 622
Рейтинг сообщения: 3
переделал так, что бы функции возвращали 32 битные значения, все локальные переменные тоже 32 бита.
В этом нет необходимости. Определяйте типы данных так, чтобы они соответствовали тому что описывают. За разрядностью процессора пусть компилятор следит. Тогда и не будет "мук переноса".

Добавлено after 10 minutes 26 seconds:
Я большей части спрашивал, в каких переменных работать в STM32.
В тех, которые нужны для логики работы программы.

Понизит ли скорость работы с 8битными переменными, например в цикле for(uint8_t j=0;j<50;++j) или же здесь предпочтительно писать uint32_t j.
В данном случае на тип переменной счётчика фиолетово, это будет регистр процессора.
Код:
//  for(uint8_t j=0;j<50;++j) __no_operation();
        MOVS     R0,#+50
??main_1:
        Nop     
        SUBS     R0,R0,#+1
        BNE      ??main_1


в текущем проекте RO-data=17610 RW-data=424 ZI-data=3816 И я засуетился :)))
Надо смотреть что больше всего жрёт память, там и ужиматься. Каких-нибудь буферов наделали, вот память и уходит. Или строковые константы без const определены и в ОЗУ копируются. Вот где надо искать, а на переменных экономить - последнее дело.

PS: 512 байт под кучу и 1024 байт под стек тоже кучеряво так.


Вернуться наверх
 


Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Ср апр 10, 2019 14:20:03 
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватар пользователя

Карма: 127
Рейтинг сообщений: 718
Зарегистрирован: Чт апр 21, 2011 18:55:50
Сообщений: 4688
Откуда: Иркутск
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
А кто и где выделяет место под стек и кучу? Почему вообще куча? Разве не можно сделать часть ОЗУ под стек, а остальное ОЗУ уже куча и есть?

_________________
Станислав


Вернуться наверх
 
Prist.ru предлагает скидку всем частным лицам при покупке приборов АКИП, GW Instek, APPA (кроме осциллографов АКИП-4115/1А, GDS-71102)!

Интересные новинки уже на складе:

Осциллограф АКИП-4126Е

Многоканальные источники питания серии GPP

В сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Ср апр 10, 2019 14:25:33 
Сверлит текстолит когтями
Аватар пользователя

Карма: 29
Рейтинг сообщений: 152
Зарегистрирован: Пт сен 07, 2018 21:20:02
Сообщений: 1250
Рейтинг сообщения: 0
Преждевременная оптимизация

Наступили мне на больной мозоль. Очень оригинально некоторые программеры эту фразу воспринимают. Да, оптимизировать программу на этапе проектирования преждевременно, так же, как в БД создавать к таблице индексы до того, как стало известно, как и сколь часто из нее будут извлекаться данные. Но уже при написании SQL запроса, выбирающего данные из этой таблицы для отчета, есть прямой смысл озаботиться созданием индекса, если подходящего нет. Потому что, как обычно, отчет замечательно работает на нескольких тысячах записей в таблице и умирает на нескольких миллионах.
А заниматься оптимизацией уже за свой счет, после рекламации заказчика - удовольствие ниже среднего.

Так что запоздалая оптимизация не меньше зло, чем преждевременная.


Вернуться наверх
 
Купить электронные компоненты в LCSC

Отправка со склада через 4 часа после заказа!
900 000 пользователей, 3000+ заказов в день!
Зарегистрируйтесь сегодня и получите скидку 8 долларов на первый заказ!
В сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Ср апр 10, 2019 14:26:08 
Друг Кота
Аватар пользователя

Карма: 76
Рейтинг сообщений: 784
Зарегистрирован: Чт апр 11, 2013 12:19:59
Сообщений: 3902
Откуда: Минск
Рейтинг сообщения: 3
СКАЗОЧНИК писал(а):
Разве не можно сделать часть ОЗУ под стек, а остальное ОЗУ уже куча и есть?
Нельзя. Ну вот, представьте, стек растёт от одного конца ОЗУ к другому. А всё остальное - куча. И тут в куче выделяется один байт, где-то близко к стеку. Всё - стек больше расти не может, упрётся в этот байт. Хотя памяти, казалось бы, свободной ещё много.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Ср апр 10, 2019 14:29:23 
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватар пользователя

Карма: 127
Рейтинг сообщений: 718
Зарегистрирован: Чт апр 21, 2011 18:55:50
Сообщений: 4688
Откуда: Иркутск
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Где-то видел картинку, на ней была обозначена область ОЗУ, в конце самом стек, а куча лишь часть памяти, которая располагалось перед стеком. Так же тоже стеку некуда расти...

_________________
Станислав


Вернуться наверх
 
В сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Ср апр 10, 2019 14:33:30 
Друг Кота
Аватар пользователя

Карма: 76
Рейтинг сообщений: 784
Зарегистрирован: Чт апр 11, 2013 12:19:59
Сообщений: 3902
Откуда: Минск
Рейтинг сообщения: 0
Да, но в этом случае хотя бы понятно, до каких пор позволено расти стеку. А в случае динамической отдачи под кучу той же памяти, что и стеку, перекрытие их может произойти в любой случайный момент.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Ср апр 10, 2019 15:14:34 
Мучитель микросхем
Аватар пользователя

Карма: 5
Рейтинг сообщений: 91
Зарегистрирован: Сб дек 22, 2012 09:17:42
Сообщений: 489
Откуда: Караганда, Казахстан
Рейтинг сообщения: 0
Оно-то, конечно, так, только вот аппаратуры контроля переполнения стека у STM32 нет, о переполнении стека мы можем узнать только тогда, когда его кто-то испортит. И то не всегда сразу, иногда такие чудеса творятся, что ой! Обсуждалось уже не один раз.

Теоретически, конечно, если стек расположить в самом начале ОЗУ, то его переполнение вызовет однозначно идентифицируемый Hard Fault, но ни одна из систем программирования STM32 так не делает.

_________________
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Вс апр 21, 2019 13:39:35 
Друг Кота

Карма: 16
Рейтинг сообщений: 214
Зарегистрирован: Пт сен 13, 2013 14:11:31
Сообщений: 6245
Рейтинг сообщения: 0
Я большей части спрашивал, в каких переменных работать в STM32. Понизит ли скорость работы с 8битными переменными, например в цикле for(uint8_t j=0;j<50;++j) или же здесь предпочтительно писать uint32_t j.

Я обычно
Код:
for(int i = 0; i < 50; i++)

пишу. На результирующем коде это никак не сказывается, а писанины меньше. :-)


Вернуться наверх
 
В сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Вс апр 21, 2019 14:11:54 
Сверлит текстолит когтями
Аватар пользователя

Карма: 29
Рейтинг сообщений: 152
Зарегистрирован: Пт сен 07, 2018 21:20:02
Сообщений: 1250
Рейтинг сообщения: 0
Оно-то, конечно, так, только вот аппаратуры контроля переполнения стека у STM32 нет

Вот, человек пишет, что ему удалось получить прерывание при доступе к ячейке памяти: https://electronics.stackexchange.com/q ... a-debugger
Нет времени, чтобы проверить самому. Но мысль интересная.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Вс апр 21, 2019 15:34:55 
Друг Кота

Карма: 16
Рейтинг сообщений: 214
Зарегистрирован: Пт сен 13, 2013 14:11:31
Сообщений: 6245
Рейтинг сообщения: 0
Как то меня всю дорогу немного раздражало, что конфигурацию пинов у F1 нужно задавать в двух регистрах (GPIOx->CRL и GPIOx->CRH) -- младшие восемь в одном регистре, а старшие в другом. Намедни подумалось, что хорошо бы обращаться к GPIOx-CRy, как к 64-битной переменной и читать или писать ее за один раз, благо Cortex-M3 такое умеет. В даташите разглядел, что эти регистры расположены по соседним адресам в порядке от младшего к старшему, значит, все подходит. С учетом, что регистры находятся в самом начале структуры GPIO, достаточно привести указатель GPIOx к типу "указатель на uint64_t", чтобы задуманное заработало. Концептуально инициализация всего порта за один присест может выглядеть следующим образом:
Код:
#define PIN_CFG(PIN, MODE)  ((uint64_t)(MODE) << ((PIN) * 4))

#define I_ANALOG            (0ULL << 2)
#define I_FLOAT             (1ULL << 2)
#define I_PULL              (2ULL << 2)

#define O_PP                (0ULL << 2)
#define O_OD                (1ULL << 2)
#define O_AF                (2ULL << 2)

#define O_10MHZ             (1ULL)
#define O_2MHZ              (2ULL)
#define O_50MHZ             (3ULL)

  *(uint64_t *) GPIOA = (
    PIN_CFG(0,  O_AF + O_OD + O_10MHZ) | /*  TIM2_CH1 PWM (OUTPUT, OPEN DRAIN, MEDIUM SPEEED)  */
    PIN_CFG(1,  I_PULL)                | /*  EXTI1 (INPUT, PULL-DOWN)                          */
    PIN_CFG(2,  I_PULL)                | /*  USART2 RX (INPUT, PULL-UP)                        */
    PIN_CFG(3,  O_AF + O_2MHZ)         | /*  USART2 TX (OUTPUT, PUSH-PULL, LOW SPEED)          */
    PIN_CFG(4,  I_ANALOG)              | /*                                      - unused -    */
    PIN_CFG(5,  I_ANALOG)              | /*                                      - unused -    */
    PIN_CFG(6,  I_ANALOG)              | /*                                      - unused -    */
    PIN_CFG(7,  I_ANALOG)              | /*                                      - unused -    */
    PIN_CFG(8,  O_2MHZ)                | /*  GPIO (OUTPUT, PUSH-PULL, LOW SPEEED)              */
    PIN_CFG(9,  I_ANALOG)              | /*                                      - unused -    */
    PIN_CFG(10, I_ANALOG)              | /*                                      - unused -    */
    PIN_CFG(11, I_ANALOG)              | /*                                      - unused -    */
    PIN_CFG(12, I_ANALOG)              | /*                                      - unused -    */
    PIN_CFG(13, I_PULL)                | /*  SWDIO (INPUT, PULL-UP)                            */
    PIN_CFG(14, I_PULL)                | /*  SWCLK (INPUT, PULL-DOWN)                          */
    PIN_CFG(15, I_ANALOG)                /*                                      - unused -    */   
  );


Даже с выключенной оптимизацией компилятор GCC приводит этот пример к виду:

Код:
    4A0A        ldr r2, =0x40010800
    F64A038D    movw r3, #0xA88D
    4C09        ldr r4, =0x08800002
    E9C23400    strd r3, r4, [r2, #0]


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

Единственный момент, который немного ухудшает стройность подхода -- это включение PULL-UP на входах, если такое требуется. В этом случае придется дополнить инициализацию порта чем-то наподобие

Код:
  GPIOA->BSRR = (                        /* Configure pulled-up pins                           */
    GPIO_BSRR_BS2                      | /* Set PA2(USART2 RX) pull-up mode                    */
    GPIO_BSRR_BS13                       /* Set PA13 (SWDIO) pull-up mode                      */
  );


Желаю слышать критику, чем вышеозначенный подход плох, если он действительно плох.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Вс апр 21, 2019 18:20:21 
Собутыльник Кота
Аватар пользователя

Карма: 4
Рейтинг сообщений: 136
Зарегистрирован: Пн окт 11, 2010 20:00:08
Сообщений: 2546
Рейтинг сообщения: 1
ПростоНуб писал(а):
Вот, человек пишет, что ему удалось получить прерывание при доступе к ячейке памяти
На F1 работает.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Чт апр 25, 2019 17:41:50 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 10
Рейтинг сообщений: 26
Зарегистрирован: Вс июн 26, 2011 21:03:21
Сообщений: 2300
Рейтинг сообщения: 0
Добрый день!
Использую в STM32 часовой кварц. Для калибровки вывел импульсы на RTC - в итоге насчитал 505 Гц, вместо 512. Сможет ли скомпенсировать такой разбег калибровка?
Если можно, объясните пожалуйста правила калибровки (какие регистры как влияют на результат), а то с даташитом у меня не особо получилось разобраться.
Благодарю :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Чт апр 25, 2019 17:45:20 
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватар пользователя

Карма: 127
Рейтинг сообщений: 718
Зарегистрирован: Чт апр 21, 2011 18:55:50
Сообщений: 4688
Откуда: Иркутск
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
https://spec-project.ucoz.ru/index/kali ... m32f1/0-14

Тут что-то по этому поводу было

_________________
Станислав


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Пт апр 26, 2019 06:06:26 
Вымогатель припоя
Аватар пользователя

Карма: 3
Рейтинг сообщений: 18
Зарегистрирован: Вт окт 23, 2012 14:17:25
Сообщений: 500
Откуда: Киселевск
Рейтинг сообщения: 0
Цитата:
Даже с выключенной оптимизацией компилятор GCC приводит этот пример к виду:

Код:
    4A0A        ldr r2, =0x40010800
    F64A038D    movw r3, #0xA88D
    4C09        ldr r4, =0x08800002
    E9C23400    strd r3, r4, [r2, #0]



Желаю слышать критику, чем вышеозначенный подход плох, если он действительно плох.



В KEIL так 5 компилятор:

Код:
-0
0x08002A0A F64A008D  MOVW     r0,#0xA88D
0x08002A0E 49FE      LDR      r1,[pc,#1016]  ; @0x08002E08
0x08002A10 4AFE      LDR      r2,[pc,#1016]  ; @0x08002E0C
0x08002A12 C203      STM      r2!,{r0-r1}

-3
0x08001FC6 4AAF      LDR      r2,[pc,#700]  ; @0x08002284
0x08001FC8 49AD      LDR      r1,[pc,#692]  ; @0x08002280
0x08001FCA F64A008D  MOVW     r0,#0xA88D
0x08001FCE E9C20100  STRD     r0,r1,[r2,#0]



Сам конфиг выглядит так на CMSIS, это то что вы напридумывали:

Код:
GPIOA->CRL = GPIO_CRL_MODE0_0 | GPIO_CRL_CNF0 | GPIO_CRL_CNF1_1 | GPIO_CRL_CNF2_1 | GPIO_CRL_MODE3_1 | GPIO_CRL_CNF3_1;
GPIOA->CRH = GPIO_CRH_MODE8_1 | GPIO_CRH_CNF13_1 | GPIO_CRH_CNF14_1;

Оптимизация здесь не требуется вообще. Флеша и скорости процессора хватает и позволяет не думать об этом. Лишняя трата времени, не тем занимаетесь.
Запоминать не надо ничего есть мануал, на любой чип открываешь и конфигурируешь. Через некоторое время забудете свой код и будете вспоминать как же вы там придумали конфигурировать, и в сети вас не поймут. А CMSIS все понимают.
Вы лучше аппаратуру, OS, драйверы изучайте и пишите хорошо. Книжки почитайте.

_________________
Инженер R@D

Жизнь начинаешь понимать тогда когда кончается здоровье


Последний раз редактировалось Oxford Пт апр 26, 2019 13:40:37, всего редактировалось 8 раз(а).

Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 5587 ]     ... , , , 273, , , ...  

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на форуме

Сейчас этот форум просматривают: 240265 и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y