Например TDA7294

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





Текущее время: Чт апр 18, 2024 03:30:45

Часовой пояс: UTC + 3 часа


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



Начать новую тему Ответить на тему  [ Сообщений: 157 ]    , , , 4, , , ,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Распределение оперативной памяти в STM32
СообщениеДобавлено: Пт авг 24, 2018 20:01:52 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
Обращение к нереализованному адресу это совсем не выход за разрешенный диапазон, и, как мне кажется, может как-то помочь уж совсем в крайнем случае.
Отладка - это не то, что я имел ввиду. Прикладная программа может отловить аварийный выход стека за пределы и реализовать что-то вроде BSOD, что может помочь в нахождении проблем при эксплуатации, когда отладчик вообще ни к месту.
Но если полноценного контроля за "сегментами" нет, все эти рассусоливания ни к чему вообще.
В итоге, имхо, всех поголовно устроил бы тот вариант, о котором и говорил топикстартер: STACK=MAXRAM-STATIC-HEAP

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Распределение оперативной памяти в STM32
СообщениеДобавлено: Пт авг 24, 2018 20:19:14 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 403
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2479
Рейтинг сообщения: -3
Сумневающиеся, о отладке в RAM не забыли?
У меня это вообще стандартно. Я почему и удивляюсь, чего такого сложного поправить скрипт линкера? Им даже размер стека лень поправить. Полный пердомонокль.
Изображение

Вложение:
D-SRAM.png [29.46 KiB]
Скачиваний: 962


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Распределение оперативной памяти в STM32
СообщениеДобавлено: Пт авг 24, 2018 20:20:22 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2693
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
VladislavS писал(а):
У меня это вообще стандартно. Я почему и удивляюсь, чего такого сложного поправить скрипт линкера? Им даже размер стека лень поправить. Полный пердомонокль.
Не придумывайте, то чего тут не говорилось. Все ходы записаны.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


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

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

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Распределение оперативной памяти в STM32
СообщениеДобавлено: Пт авг 24, 2018 20:41:59 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 403
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2479
Рейтинг сообщения: 0
Не придумывайте, то чего тут не говорилось. Все ходы записаны.

Ну да, конечно, записыватель нашёлся.

Угу. Только EmBitz делает это сам, без моих движений, а Кейлу я должен буду править каждый проект, где мне нужно такое распределение памяти. И еще непонятно, как при этом бороться с кейловскими Stack_Size и Heap_Size - их же тоже придется регулярно править...

Размер стэка и кучи в каждом проекте править, Карл!


Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

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

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Распределение оперативной памяти в STM32
СообщениеДобавлено: Пт авг 24, 2018 20:48:53 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2693
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Инициализировал SP значением 0x20000000, то бишь ниже ОЗУ, в каком-то ничего не делающем особо проекте. Никаких настроек для обработки исключения больше не делал.
При запуске ввалился в Default_Handler().
Вот причина.
СпойлерИзображение

SP=0x1fffffe0

Ну нормально, можно так за стеком следить.
МК STM32F103

Добавлено after 1 minute 43 seconds:
VladislavS писал(а):
Размер стэка и кучи в каждом проекте править,
И где тут некие "они" сказали что "им" лень?

Добавлено after 4 minutes 9 seconds:
Где-то у меня еще 030 валяется, на нем чтоли еще попробовать, что будет.


Вложения:
HF.png [52.41 KiB]
Скачиваний: 417

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Распределение оперативной памяти в STM32
СообщениеДобавлено: Пт авг 24, 2018 21:00:50 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 403
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2479
Рейтинг сообщения: 0
А есть ешё чипы с CCM RAM и в них стек очень хорошо туда ложится. Как вы не поймёте, что не бывает одного универсального/правильного/лучшего решения для всех проектов.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Распределение оперативной памяти в STM32
СообщениеДобавлено: Пт авг 24, 2018 21:04:31 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2693
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
В регистре BFAR значение 1ffffff8. Получается ошибка не конкретно срыва стека, а ошибка адреса. Т.е. этот регистр хранит адрес куда пытался залезть.
Но вроде как, можно отдельно настроить прерывание для М3 при проблемах со стеком, судя по маскам указанным мной ранее. Хотя я их ошибочно флагами назвал. Короче там много надо курить.
Хотя и этого достаточно чтобы за стеком бдить.

Добавлено after 1 minute 21 second:
А есть ешё чипы с CCM RAM и в них стек очень хорошо туда ложится. Как вы не поймёте, что не бывает одного универсального/правильного/лучшего решения для всех проектов.
Большой дядя, и этого никто не заявлял и не искал универсального решения для всего.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Распределение оперативной памяти в STM32
СообщениеДобавлено: Пт авг 24, 2018 21:13:17 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 403
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2479
Рейтинг сообщения: 0
Большой дядя, и этого никто не заявлял и не искал универсального решения для всего.
Мне уже надоело тыкать вас мордой. Либо читать не умеете, либо с памятью плохо.

Это каждому проекту крутить, а хотелось бы поставить где-нибудь галочку, чтобы он делал это сам и для всех.
Для всех проектов одной галочкой, Карл!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Распределение оперативной памяти в STM32
СообщениеДобавлено: Пт авг 24, 2018 21:18:13 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2693
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
VladislavS писал(а):
Мне уже надоело тыкать вас мордой. Либо читать не умеете, либо с памятью плохо.
Морду ищи в зеркале.
А одна галочка, имелось ввиду на конец памяти, а не универсальное решение для всего. Читать я умею.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Распределение оперативной памяти в STM32
СообщениеДобавлено: Пт авг 24, 2018 21:32:00 
Друг Кота
Аватар пользователя

Карма: 1
Рейтинг сообщений: 157
Зарегистрирован: Пн окт 11, 2010 19:00:08
Сообщений: 3328
Рейтинг сообщения: 0
Z_h_e писал(а):
Инициализировал SP значением 0x20000000, то бишь ниже ОЗУ, в каком-то ничего не делающем особо проекте. Никаких настроек для обработки исключения больше не делал.
При запуске ввалился в Default_Handler().

МК STM32F103
Это STM32F103 попадает в Default_Handler()? В таблице не нашел такого прерывания. Может имелся в виду МК с ядром M0?
В STM32F103 при выходе стека за пределы ОЗУ происходит переход в HardFault_Handler().


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Распределение оперативной памяти в STM32
СообщениеДобавлено: Пт авг 24, 2018 21:37:52 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2693
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Ага, именно 103. Я в кокосе, может просто по разному обозваны обработчики исключений.

А вот сейчас я пробую 030. Но только распаковал его, еще до этого не пробовал никогда. Сразу обратил внимание, что SP уже инициализируется ручками, а нулевой вектор Reserved.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Распределение оперативной памяти в STM32
СообщениеДобавлено: Пт авг 24, 2018 21:48:02 
Друг Кота
Аватар пользователя

Карма: 1
Рейтинг сообщений: 157
Зарегистрирован: Пн окт 11, 2010 19:00:08
Сообщений: 3328
Рейтинг сообщения: 0
Z_h_e писал(а):
А вот сейчас я пробую 030. Но только распаковал его, еще до этого не пробовал никогда. Сразу обратил внимание, что SP уже инициализируется ручками, а нулевой вектор Reserved.
По нулевому вектору адрес стека как и в STM32F103.


Последний раз редактировалось Мурик Пт авг 24, 2018 21:52:24, всего редактировалось 2 раз(а).

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Распределение оперативной памяти в STM32
СообщениеДобавлено: Пт авг 24, 2018 22:20:19 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2693
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Так этож не вектор, а дефолтный обработчик.

Добавлено after 20 minutes 15 seconds:
Попробовал на 030. Стартап тут у меня уже ассмоский. По умолчанию SP на конец оперативки. Инициализировал SP=0x20000000. Ожидаемо ввалился в обработчик преывания по умолчанию. С регистрами причины не стал разбираться. Можно будет поразибраться именно по какому вектору идет прерывание. Но это уже вопрос техники.
Надо будет со скриптом линкера поразбираться и попробовать стек поставить вперед кобылы :).
Нормальная в общем то идея бдить за срывом стека.

Добавлено after 3 minutes 45 seconds:
Мурик писал(а):
По нулевому вектору адрес стека как и в STM32F103.
Стартап у меня его туда кладет, но он не используется. (исп. 25.08.2018 07:30)
Вот как там происходит инициализация.
Код:
Reset_Handler:
  ldr   r0, =_eram
  mov   sp, r0 

Правка вектора №0 эффекта не дает в 030.
А это уже из скрипта линкера
Код:
_eram = 0x20000000 + 0x00001000;


Добавлено after 5 minutes 35 seconds:
Получается в 030 в линкере не выделяется секция под стек. Просто в конец sp и все. Но тут МК конечно самый простецкий из линейки stm32.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Последний раз редактировалось Z_h_e Сб авг 25, 2018 06:23:24, всего редактировалось 2 раз(а).

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Распределение оперативной памяти в STM32
СообщениеДобавлено: Пт авг 24, 2018 22:39:55 
Друг Кота
Аватар пользователя

Карма: 1
Рейтинг сообщений: 157
Зарегистрирован: Пн окт 11, 2010 19:00:08
Сообщений: 3328
Рейтинг сообщения: 0
Z_h_e писал(а):
Стартап у меня его туда кладет, но он не используется.Вот как там происходит инициализация.
Код:
Reset_Handler:
  ldr   r0, =_eram
  mov   sp, r0
В EmBitz немного другой код в стартапе для M0.
Спойлер
Код:
Reset_Handler:
/*     Loop to copy data from read only memory to RAM. The ranges
 *      of copy from/to are specified by following symbols evaluated in
 *      linker script.
 *      __etext: End of code section, i.e., begin of data sections to copy from.
 *      __data_start__/__data_end__: RAM address range that data should be
 *      copied to. Both must be aligned to 4 bytes boundary.  */

    ldr    r1, =__etext
    ldr    r2, =__data_start__
    ldr    r3, =__data_end__

    subs    r3, r2
    ble    .flash_to_ram_loop_end

    movs    r4, 0
.flash_to_ram_loop:
    ldr    r0, [r1,r4]
    str    r0, [r2,r4]
    adds    r4, 4
    cmp    r4, r3
    blt    .flash_to_ram_loop
.flash_to_ram_loop_end:

#ifndef __NO_SYSTEM_INIT
    ldr    r0, =SystemInit
    blx    r0
#endif

    ldr    r0, =_start
    bx    r0
    .pool
    .size Reset_Handler, . - Reset_Handler

/* Our weak _start alternative if we don't use the library _start
 * The zero init section must be cleared, otherwise the librtary is
 * doing that */
    .align 1
    .thumb_func
    .weak _start
    .type _start, %function
_start:

    /* Zero fill the bss segment. */
    ldr   r1, = __bss_start__
    ldr   r2, = __bss_end__
    movs  r3, #0
    b  .fill_zero_bss
.loop_zero_bss:
    str  r3, [r1]
   adds r1, 4

.fill_zero_bss:
    cmp  r1, r2
    bcc  .loop_zero_bss

    /* Jump to our main */
    bl main
    b .
    .size    _start, . - _start
ld файле стек размещается в конце ОЗУ.
Спойлер
Код:
   /* .stack_dummy section doesn't contains any symbols. It is only
    * used for linker to calculate size of stack sections, and assign
    * values to stack symbols later */
   .stack_dummy (NOLOAD):
   {
      *(.stack)
   } > RAM

   /* Set stack top to end of RAM, and stack limit move down by
    * size of stack_dummy section */
   __StackTop = ORIGIN(RAM) + LENGTH(RAM);
   __StackLimit = __StackTop - SIZEOF(.stack_dummy);
   PROVIDE(__stack = __StackTop);
   
   /* Check if data + heap + stack exceeds RAM limit */
   ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Распределение оперативной памяти в STM32
СообщениеДобавлено: Сб авг 25, 2018 05:21:19 
Опытный кот
Аватар пользователя

Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42
Сообщений: 744
Откуда: Караганда, Казахстан
Рейтинг сообщения: 0
VladislavS писал(а):
Для всех проектов одной галочкой, Карл!
Именно. До сих пор всё, что я знал о скриптах линкера, это то, что они существуют, что их генерит среда, которую я пользую, и больше ничего. И был счастлив в своем незнании. А теперь выясняется, что одна из сред генерит нечто неудобное и мне для комфортной работы надо куда-то лезть и что-то править. На хрена мне, спрашивается, это удовольствие? Классическое преодоление трудностей, специально для этой цели придуманных.

Ладно, случай с malloc() в некоторой степени надуманный - это характерно, скорее, для компьютеров, где и памяти может быть разное количество, и загруженность другими задачами разной. На МК изменение размера доступной памяти возможно только при переносе на другой МК, не грех и руками поправить. То есть, бог с ней, с кучей. Но ведь в стеке располагаются автоматические переменные и массивы. Приспичит мне в какой-то программуле объявить массив килобайт на несколько, и лезь в startup_stm32f10x_md править размер стека. Какого хрена я вынужден делать правку сразу в двух местах? Чем думали кейловские программисты, когда делали такое? Головой? Ну, так пусть сядут на нее!..

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Распределение оперативной памяти в STM32
СообщениеДобавлено: Сб авг 25, 2018 05:50:49 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2693
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
За то мы тут нашли способ контроля переполнения стека. В принципе он лежал на поверхности, но я лично даже не думал об этом до сей темы форума :).

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Распределение оперативной памяти в STM32
СообщениеДобавлено: Сб авг 25, 2018 05:59:38 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 403
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2479
Рейтинг сообщения: 1
Добавлено after 3 minutes 45 seconds:
Мурик писал(а):
По нулевому вектору адрес стека как и в STM32F103.
Стартап у меня его туда кладет, но он не используется.
Этого не может быть, потому что не может быть никогда. Это же кортекс, он по ресету аппаратно из нулевого вектора загружает указатель стека.

Вот как там происходит инициализация.
Код:
Reset_Handler:
  ldr   r0, =_eram
  mov   sp, r0 
Это написано для случая, если либо загрузчик, либо отладчик загрузил прошивку в ОЗУ и не знает, что надо стек инициализировать значением из нулевого вектора. В принципе, можно убрать.

Правка вектора №0 эффекта не дает в 030.
А чего бы она давала эффект, если стартап его переинициализирует на _eram.

Добавлено after 8 minutes 15 seconds:
Какого хрена я вынужден делать правку сразу в двух местах? Чем думали кейловские программисты, когда делали такое? Головой? Ну, так пусть сядут на нее!..
Хорош истерить уже. Всё там в одном месте правится. У Keil не лучшее решение в этом плане, но оно рабочее.
Изображение

Вложение:
Keil_stack.png [48.04 KiB]
Скачиваний: 578


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Распределение оперативной памяти в STM32
СообщениеДобавлено: Сб авг 25, 2018 06:02:29 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2693
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
VladislavS писал(а):
Это же кортекс, он по ресету аппаратно из нулевого вектора загружает указатель стека.
Да, с этим я перемудрил. Сбило с толку принудительная инициализация SP и Reserved в таблице векторов. Хотя второе есть и на 103. Сейчас обозначу это в ранее сказанном.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Распределение оперативной памяти в STM32
СообщениеДобавлено: Сб авг 25, 2018 06:34:07 
Потрогал лапой паяльник

Карма: 5
Рейтинг сообщений: 44
Зарегистрирован: Ср янв 04, 2012 11:57:40
Сообщений: 394
Откуда: Алчевск
Рейтинг сообщения: 0
Однажды в одной программе столкнулся с переполнением стека. Как изменить размер быстро не нашел, пошел обходным путем. Такой вариант беру на заметку. Правда на изменение размера кучи ругается.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Распределение оперативной памяти в STM32
СообщениеДобавлено: Сб авг 25, 2018 06:43:43 
Опытный кот
Аватар пользователя

Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42
Сообщений: 744
Откуда: Караганда, Казахстан
Рейтинг сообщения: 0
VladislavS писал(а):
Всё там в одном месте правится.
Неправда. В одном месте я исправил свою программу - добавил массив и что-то с ним делаю. А еще я должен не забыть в другом месте поправить размер стека.

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


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

Часовой пояс: UTC + 3 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16


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

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


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