Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: TI AM1808
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2
doom13
Не работает кусок кода для настройки регистра , в чём может быть проблема:
Код
unsigned int *pPinMux = (unsigned int *) PINMUX_REG_ADDR;

void SetPinMux(void)
{
     unsigned int savePinmux = 0;

     savePinmux = *pPinMux;
     savePinmux |= 1;
     *pPinMux = savePinmux;
}

Если указатель на обычный кусок памяти - всё гуд.
SAURIS GmbH
Как вариант, этому блоку, в котором находится регистр, не включен клок, или он не выведен из состояния резета (по аналогии с другими АРМ-ами TI)
doom13
Цитата(SAURIS GmbH @ Jun 25 2014, 11:39) *
Как вариант, этому блоку, в котором находится регистр, не включен клок, или он не выведен из состояния резета (по аналогии с другими АРМ-ами TI)

Я могу записать данные по этому адресу через Memory Browser и прочитать. Могу сделать вывод, что клок есть и из ресета выведен!?
Сергей Борщ
Цитата(doom13 @ Jun 25 2014, 11:21) *
в чём может быть проблема
Думаю, что проблема в уровне подготовки программиста. Оптимизатор мог выкинуть этот код как не делающий никакой полезной работы. Для объяснения, что подобные действия программиста имеют смысл, создатели языка придумали квалификатор volatile.
SAURIS GmbH
Цитата(doom13 @ Jun 25 2014, 13:04) *
Я могу записать данные по этому адресу через Memory Browser и прочитать. Могу сделать вывод, что клок есть и из ресета выведен!?


Именно в тот момент, когда "этот код не работает" ? То есть, поставив туда точку останова, и после ее срабатывания?

Еще попробуйте убрать в скобки "PINMUX_REG_ADDR" - может быть он объявлен как арифметика без скобок в дефайне, и тогда результат от (unsigned int*) может быть непредсказуем.


2 Сергей Борщ - Ну раз "Если указатель на обычный кусок памяти - всё гуд" - то, вроде, volatile тут не причем. Да и не должен оптимизатор такое выкидывать, когда работа через указатель, объявленный глобально.
doom13
Цитата(Сергей Борщ @ Jun 25 2014, 12:30) *
Думаю, что проблема в уровне подготовки программиста. Оптимизатор мог выкинуть этот код как не делающий никакой полезной работы. Для объяснения, что подобные действия программиста имеют смысл, создатели языка придумали квалификатор volatile.

Это пример того, что должен делать код. Сам код из либы TI и написан через макросы. Оптимизатор выключен и он тут не при чём,
читайте внимательнее
Цитата(doom13 @ Jun 25 2014, 11:21) *
Если указатель на обычный кусок памяти - всё гуд.

Сергей Борщ
Цитата(doom13 @ Jun 25 2014, 12:50) *
Это пример того, что должен делать код.
А, так вопрос был адресован телепатам?
Цитата(doom13 @ Jun 25 2014, 12:50) *
Сам код из либы TI и написан через макросы.
В либах тоже могут быть ошибки. И часть из них даже может не проявляться на тех версиях компилятора, которые используют разработчики либы.
Цитата(doom13 @ Jun 25 2014, 12:50) *
Оптимизатор выключен и он тут не при чём,
А, ну тогда успехов в отладке. И еще раз успехов в повторной отладке, которая понадобится после включения оптимизатора.
doom13
Цитата(SAURIS GmbH @ Jun 25 2014, 12:40) *
Еще попробуйте убрать в скобки "PINMUX_REG_ADDR" - может быть он объявлен как арифметика без скобок в дефайне, и тогда результат от (unsigned int*) может быть непредсказуем.

Нет, проблема не в скобках, что-то другое.
Цитата(SAURIS GmbH @ Jun 25 2014, 12:40) *
Именно в тот момент, когда "этот код не работает" ? То есть, поставив туда точку останова, и после ее срабатывания?

Поставить точку останова перед записью, пройти запись, не увидеть результат в Memory Browser.
Поставить точку останова перед чтением, через Memory Browser записать значение в память, пройти чтение и в переменной вижу верное значение. Т.е. с чтением всё ок, писать не хочет.


Цитата(Сергей Борщ @ Jun 25 2014, 13:13) *
А, так вопрос был адресован телепатам?

Просто программисты с достаточным (ну или крайне высоким) уровнем сначала вникают в суть задачи, а потом пишут достойный код, а не всякую чушь не прочитав задачу до конца. Остальным, смотрю, вопрос оказался понятен, на основании чего и могу судить об их уровне.
Цитата(Сергей Борщ @ Jun 25 2014, 13:13) *
В либах тоже могут быть ошибки. И часть из них даже может не проявляться на тех версиях компилятора, которые используют разработчики либы.

Это известно, поэтому и попробовал переписать их макросы и проверить, что же там не так, ошибка, вижу, не в либе, а где-то глубже.
Цитата(Сергей Борщ @ Jun 25 2014, 13:13) *
А, ну тогда успехов в отладке. И еще раз успехов в повторной отладке, которая понадобится после включения оптимизатора.

Ответ достойный специалиста высочайшего уровня.
SAURIS GmbH
Цитата(doom13 @ Jun 25 2014, 14:46) *
Поставить точку останова перед чтением, через Memory Browser записать значение в память, пройти чтение и в переменной вижу верное значение. Т.е. с чтением всё ок, писать не хочет.


Возможно, что-то с механизмами защиты памяти. Уровни доступа через эмулятор и у пользовательского кода - это, как говорится, две большие разницы.
doom13
Цитата(SAURIS GmbH @ Jun 25 2014, 12:40) *

Там есть такая штука, как PSC Module, может ли в ней быть проблема? В даташите написано, что касательно GPIO - Always ON, может ли что-либо быть в PSC отключено для GPIO?


Цитата(SAURIS GmbH @ Jun 25 2014, 13:56) *
Возможно, что-то с механизмами защиты памяти. Уровни доступа через эмулятор и у пользовательского кода - это, как говорится, две большие разницы.

Да, вот для c2000 и с6000 от TI были такие штуки как EALLOW и EDIS, которые и разрешают запись защищённых регистров. Но ведь здесь такого нет?!
SAURIS GmbH
Цитата(doom13 @ Jun 25 2014, 14:59) *
В даташите написано, что касательно GPIO - Always ON, может ли что-либо быть в PSC отключено для GPIO?


Ну Вы сами же это опровергли, когда я предполагал, что что-то не выведено из резета или обесклочено. Тогда бы и через эмулятор не писалось (хотя, возможно, вопрос еще в GEL, что при запуске под эмуляцией он что-то там сам проинициализировал, а без эмуляции - нет)

Цитата(doom13 @ Jun 25 2014, 15:02) *
Но ведь здесь такого нет?!


Зато тут есть куда круче. Memory Protection Unit (MPU), режимы исполнения Supervisor и User, и в самом ARM еще есть MMU.
doom13
Цитата(SAURIS GmbH @ Jun 25 2014, 14:04) *
Ну Вы сами же это опровергли, когда я предполагал, что что-то не выведено из резета или обесклочено. Тогда бы и через эмулятор не писалось (хотя, возможно, вопрос еще в GEL, что при запуске под эмуляцией он что-то там сам проинициализировал, а без эмуляции - нет)

Я то может и опроверг, но процессор для меня новый и могу ошибаться. В примере из StarterWare на AM1808 для GPIO в самом начале идёт
Код
/* The Local PSC number for GPIO is 3. GPIO belongs to PSC1 module.*/
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);

, это и смущает, может ли PSC как-то влиять? Если в даташите написано Always ON зачем тогда эта функция?

Цитата(SAURIS GmbH @ Jun 25 2014, 14:04) *
Зато тут есть куда круче. Memory Protection Unit (MPU), режимы исполнения Supervisor и User, и в самом ARM еще есть MMU.

Об этом я пока ничего не знаю, надо читать.
SAURIS GmbH
Цитата(doom13 @ Jun 25 2014, 15:22) *
Я то может и опроверг, но процессор для меня новый и могу ошибаться. В примере из StarterWare на AM1808 для GPIO в самом начале идёт


ну вообще документация говорит вот что:


20.2.9 Initialization
The following steps are required to configure the GPIO module after a hardware reset:
1. Perform the necessary device pin multiplexing setup (see your device-specific data manual).
2. Program the Power and Sleep Controller (PSC) to enable the GPIO module. For details on the PSC, see the Power and Sleep Controller (PSC) chapter.


А где сказано, что он "Always ON" ? Я вижу в разделе про PSC, что у него состояние по умолчанию "SwRstDisable" а не "Enable" Но, еще раз, раз эмулятор пишет в этот регистр, то это говорит, что он все же включен. Ну, либо, это какие-то глюки каких-то кешей, что эмулятор якобы пишет, но только якобы. Как перевести его в Enable читайте в "8.3.2 Module State Transitions" - там надо задать Enable в его MDCTLn и потом дать "GO" в PTCMD
doom13
Цитата(SAURIS GmbH @ Jun 25 2014, 14:32) *
ну вообще документация говорит вот что:


20.2.9 Initialization
The following steps are required to configure the GPIO module after a hardware reset:
1. Perform the necessary device pin multiplexing setup (see your device-specific data manual).
2. Program the Power and Sleep Controller (PSC) to enable the GPIO module. For details on the PSC, see the Power and Sleep Controller (PSC) chapter.


А где сказано, что он "Always ON" ? Я вижу в разделе про PSC, что у него состояние по умолчанию "SwRstDisable" а не "Enable" Но, еще раз, раз эмулятор пишет в этот регистр, то это говорит, что он все же включен. Ну, либо, это какие-то глюки каких-то кешей, что эмулятор якобы пишет, но только якобы.

Я вот на это смотрел (рисунок), счас попробую найти то, о чём Вы пишете. Регистр, который записать не могу, и отвечает за pin multiplexing.
SAURIS GmbH
Цитата(doom13 @ Jun 25 2014, 15:37) *
Я вот на это смотрел (рисунок),


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

Эмулятором считайте регистр MDSTAT19 MDSTAT3 в PSC1 - будет видно, в каком состоянии GPIO

UPD:
По идее, его мог включить (если он включен) начальный загрузчик, который в ROM, если ему надо что-то делать через GPIO.

UPD2:
Его включает GEL файл, вызовом "PSC1_LPSC_enable(0, LPSC_GPIO);" - так что при запуске из-под эмулятора, если GEL подцеплен, то GPIO включен (и вообще, он там все что ни попадя включает).

doom13
Цитата(SAURIS GmbH @ Jun 25 2014, 14:42) *
Вот именно на этом рисунке и написано, что его состояние по умолчанию - SwRstDisable, что значит, что он без клока и в резете. Ну да, питание ему выключить нельзя... Но что это меняет, если ему обрублено все остальное sm.gif sm.gif

Эмулятором считайте регистр MDSTAT19 MDSTAT3 в PSC1 - будет видно, в каком состоянии GPIO

UPD:
По идее, его мог включить (если он включен) начальный загрузчик, который в ROM, если ему надо что-то делать через GPIO.

UPD2:
Его включает GEL файл, вызовом "PSC1_LPSC_enable(0, LPSC_GPIO);" - так что при запуске из-под эмулятора, если GEL подцеплен, то GPIO включен (и вообще, он там все что ни попадя включает).


Вызываю скрипт из GEL, что должно всё включить, но эффекта не наблюдаю.
Код
hotmenu
Setup_Psc_All_On( )
{
    .......

    PSC1_lPSC_enable(0, 3);   // GPIO

    ......
}

Значения регистров прилагаю, они?
SAURIS GmbH
Цитата(doom13 @ Jun 25 2014, 16:26) *
Значения регистров прилагаю, они?


Не, не совсем они. Нужного MDSTAT тут нет. Его адрес 01E2780Ch

( MDSTAT0 - 01E27800h )
( MDSTAT1 - 01E27804h )
( MDSTAT2 - 01E27808h )
( MDSTAT3 - 01E2780Ch )
( MDSTAT4 - 01E27810h )
....
doom13
Цитата(SAURIS GmbH @ Jun 25 2014, 15:39) *
Не, не совсем они. Нужного MDSTAT тут нет. Его адрес 01E27810h

Счас посмотрим этот.
Сделал ещё такую проверку. Запускаю на выполнение скрипт из GEL с кодом
Код
#define SYS_BASE            0x01C14000
#define KICK0R              *(unsigned int*)(SYS_BASE + 0x038)  
#define KICK1R              *(unsigned int*)(SYS_BASE + 0x03c)  
#define PINMUX17            *(unsigned int*)(SYS_BASE + 0x164)  //PINMUX17

hotmenu
Setup_System_Config( )
{
    GEL_TextOut( "Setup PINMUX Registers... " );
    KICK0R = 0x83e70b13;  // Kick0 register + data (unlock)
    KICK1R = 0x95a4f1e0;  // Kick1 register + data (unlock)

    PINMUX17  = 0x22222222;  // LCDIO
  
    GEL_TextOut( "[My test is done!!!]\n" );
}

, как понимаю, в Memory Browser по адресу должен увидеть 0x22222222, но там нет изменений при выполнении скрипта?
В консоли только вижу "ARM9_0: GEL Output: Setup PINMUX Registers...ARM9_0: GEL Output: [My test is done!!!]"

SAURIS GmbH
Цитата(doom13 @ Jun 25 2014, 16:45) *
, как понимаю, в Memory Browser по адресу должен увидеть 0x22222222, но там нет изменений при выполнении скрипта?
В консоли только вижу "ARM9_0: GEL Output: Setup PINMUX Registers...ARM9_0: GEL Output: [My test is done!!!]"


Во первых, я там ошибся с адресом, исправил, сорри.

Во вторых - да, должны увидеть 0x22222222. Но, если это сделано до PSC1_LPSС_ENABLE для GPIO, то и не должны.
doom13
Цитата(SAURIS GmbH @ Jun 25 2014, 15:39) *
Не, не совсем они. Нужного MDSTAT тут нет. Его адрес 01E2780Ch

Но это что-то очень близкое по значению, вот то, что по адресам лежит
SAURIS GmbH
Ой. Был не прав. PINMUX это же SYSCFG, а не GPIO.

Ну GPIO включен. Так что разбирайтесь, скорее всего, с memory protection, чего это он не дает туда записывать из ARM.

После выполнения скрипта, возможно надо обновить содержимое browser, он может автоматом не обновляться, и увидеть там 22222222
doom13
Цитата(SAURIS GmbH @ Jun 25 2014, 15:48) *
Во вторых - да, должны увидеть 0x22222222. Но, если это сделано до PSC1_LPSС_ENABLE для GPIO, то и не должны.

При подключении к Target Configuration GEL и выполнении Target Connect, автоматом выполняется скрипт
CODE

OnTargetConnect( )
{
GEL_TextOut( "\nAM1808 ARM Startup Sequence\n\n" );

Setup_System_Config( ); // Setup Pin Mux and other system module registers
Setup_Psc_All_On( ); // Setup All Power Domains
Setup_PLL0(); // Setup PLL0 (300MHZ ARM, 300MHz DSP, 133MHz EMIFs
Setup_EMIFA(); // Async EMIF
Setup_PLL1(); // PLL for DDR Clock
DDRConfig(132); // Setup DDR

GEL_TextOut( "\nStartup Complete.\n\n" );
}

, где в теле Setup_Psc_All_On( ) прописано
CODE

hotmenu
Setup_Psc_All_On( )
{
int i;
GEL_TextOut( "Setup Power Modules (All on)... " );

// PSC0
PSC0_lPSC_enable(0, 0); // EDMA_CC0
PSC0_lPSC_enable(0, 1); // EDMA_TC0
PSC0_lPSC_enable(0, 2); // EDMA_TC1
PSC0_lPSC_enable(0, 3); // EMIFA
PSC0_lPSC_enable(0, 4); // SPI0
PSC0_lPSC_enable(0, 5); // MMCSD0
PSC0_lPSC_enable(0, 6); // ARM_AINTC
PSC0_lPSC_enable(0, 7); // ARM_RAMROM
// #8 not used
PSC0_lPSC_enable(0, 9); // UART0
PSC0_lPSC_enable(0, 10); // SCR0
PSC0_lPSC_enable(0, 11); // SCR1
PSC0_lPSC_enable(0, 12); // SCR2
// #13 not used
// PSC0_lPSC_enable(0, 14); // ARM

// PSC1
PSC1_lPSC_enable(0, 0); // EDMA_CC1
PSC1_lPSC_enable(0, 1); // USB20
PSC1_lPSC_enable(0, 2); // USB11
PSC1_lPSC_enable(0, 3); // GPIO
PSC1_lPSC_enable(0, 4); // UHPI
PSC1_lPSC_enable(0, 5); // EMAC
PSC1_lPSC_enable(0, 6); // DDR
PSC1_lPSC_enable(0, 7); // MCASP0
PSC1_LPSC_force(8);
PSC1_lPSC_enable(0, 8); // SATA

PSC1_lPSC_enable(0, 9); // VPIF
PSC1_lPSC_enable(0, 10); // SPI1
PSC1_lPSC_enable(0, 11); // I2C1
PSC1_lPSC_enable(0, 12); // UART1
PSC1_lPSC_enable(0, 13); // UART2
PSC1_lPSC_enable(0, 14); // MCBSP0
PSC1_lPSC_enable(0, 15); // MCBSP1
PSC1_lPSC_enable(0, 16); // LCDC
PSC1_lPSC_enable(0, 17); // EPWM
PSC1_lPSC_enable(0, 18); // MMCSD1
PSC1_lPSC_enable(0, 19); // UPP
PSC1_lPSC_enable(0, 20); // ECAP
PSC1_lPSC_enable(0, 21); // EDMA_TC2
// #22 & 23 not used
PSC1_lPSC_enable(0, 24); // SCR_F0
PSC1_lPSC_enable(0, 25); // SCR_F1
PSC1_lPSC_enable(0, 26); // SCR_F2
PSC1_lPSC_enable(0, 27); // SCR_F6
PSC1_lPSC_enable(0, 28); // SCR_F7
PSC1_lPSC_enable(0, 29); // SCR_F8
PSC1_lPSC_enable(0, 30); // BR_F7
PSC1_lPSC_enable(0, 3); // SHARED_RAM

GEL_TextOut( "[Done]\n" );
}

, т.е. строка PSC1_lPSC_enable(0, 3) есть в наличии, и я должен был увидеть мои 0х22222222?

SAURIS GmbH
Цитата(doom13 @ Jun 25 2014, 17:01) *
, т.е. строка PSC1_lPSC_enable(0, 3) есть в наличии, и я должен был увидеть мои 0х22222222?


Это не важно, я же поправился, тут речь про SYSCFG, а не GPIO. Вы должны увидеть 0x22222222, если откроете memory browser ПОСЛЕ исполнения вашего "hotmenu", или если вручную обновите в нем данные.
doom13
Цитата(SAURIS GmbH @ Jun 25 2014, 16:05) *
Это не важно, я же поправился, тут речь про SYSCFG, а не GPIO. Вы должны увидеть 0x22222222, если откроете memory browser ПОСЛЕ исполнения вашего "hotmenu", или если вручную обновите в нем данные.

Проверил для регистра PLL0_PLLCTL, этот обновляется после записи через скрипт.
SAURIS GmbH
Странно это. Жаль я не могу проверить это сейчас.

Ну тут как вариант, надо включить сначала LCDC в PSC1. А попробуйте другие PINMUX писать, например EMIF. Попробуйте туда записать 22222222 прямо через memory browser, и потом обновить его, для проверки "а записалось ли".
doom13
Цитата(SAURIS GmbH @ Jun 25 2014, 15:57) *
Ну GPIO включен. Так что разбирайтесь, скорее всего, с memory protection, чего это он не дает туда записывать из ARM.

Почитал про механизм защиты записи регистров, реализуется через регистры KICK0R-KICK1R. В скрипте прописан unlock, но не помогает, ещё нашёл, что со 2 ревизии кремния этот механизм отменён, т.е. в моём случае это никак не влияет (AM1808B). Про memory protection units (MPU1 and MPU2) понял, что один для защиты On-Chip RAM, другой - для DDR2/mDDR SDRAM, т.е. влиять на память для моего PINMUX17 не должно.
SAURIS GmbH
Цитата(doom13 @ Jun 25 2014, 17:39) *
Про memory protection units (MPU1 and MPU2) понял, что один для защиты On-Chip RAM, другой - для DDR2/mDDR SDRAM, т.е. влиять на память для моего PINMUX17 не должно.


Возможно, но в любом случае, на сколько я помню, запись в эти регистры (SYSCFG) возможна только из Priveleged mode. В общем, тут моя память закончилась (на сколько я помню, эмулятор всегда в Privileged, поэтому писать должен. Да и тот же GEL, конфигурируя, например, EMIF, свободно меняет PINMUXы). Для дальнейших полезных подсказок надо иметь на столе систему на AM1808, к сожалению сейчас таковой у меня нет.

Вдогонку... У меня были похожие глюки на AM3517, когда я случайно запустил его на сильно запредельной частоте PLL... Вряд ли, конечно, у Вас такое же. Но тем не менее...
doom13
Цитата(SAURIS GmbH @ Jun 25 2014, 16:55) *
Возможно, но в любом случае, на сколько я помню, запись в эти регистры (SYSCFG) возможна только из Priveleged mode. В общем, тут моя память закончилась (на сколько я помню, эмулятор всегда в Privileged, поэтому писать должен. Да и тот же GEL, конфигурируя, например, EMIF, свободно меняет PINMUXы). Для дальнейших полезных подсказок надо иметь на столе систему на AM1808, к сожалению сейчас таковой у меня нет.

Вдогонку... У меня были похожие глюки на AM3517, когда я случайно запустил его на сильно запредельной частоте PLL... Вряд ли, конечно, у Вас такое же. Но тем не менее...

Со скриптом разобрался, оказалось половина исполняемой функции была закоментирована (блокнотом смотрел не заметил комент, после того, как сделал свою, всё записалось и тагда только заметил).
Но из программы по-прежнему не хочет пока писать, читает, как и ранее, нормально.

Счас ещё про Priveleged mode читну.
SAURIS GmbH
Цитата(doom13 @ Jun 25 2014, 18:02) *
Счас ещё про Priveleged mode читну.


Если правильно помню, туда через SWI вход - либо System mode, либо Supervisor. Увидеть же, какой режим сейчас, можно в PSR (биты 4:0)
doom13
Почитал о том, что Вы говорили. Так и есть, написано, что доступ к PINMUX только в режиме Privileged Mode. При остановке на записи в регистр PINMUX смотрю PSR[4:0], там значение 10000b - User Mode. Видимо, в этом-то и проблема. Не понятно, почему в примере от TI нет ничего, чтобы указывало на какие-то дополнительные действия, main начинается с настройки PSC, далее настройка PINMUX.
SAURIS GmbH
Тут другой вопрос скорее... Кто и зачем включил этот user mode? По reset-у согласно документации ядро стартует супервайзером (Table 2-1.)
doom13
Цитата(SAURIS GmbH @ Jun 25 2014, 20:48) *
Тут другой вопрос скорее... Кто и зачем включил этот user mode? По reset-у согласно документации ядро стартует супервайзером (Table 2-1.)

Максимум, я при старте запускал скрипты из GEL, если только они, там OnConnect что-то выполняется, надо глянуть ещё раз, далее main и сразу настройка PINMUX17, которая и не работает.
SAURIS GmbH
Цитата(doom13 @ Jun 26 2014, 00:00) *
Максимум, я при старте запускал скрипты из GEL, если только они, там OnConnect что-то выполняется, надо глянуть ещё раз, далее main и сразу настройка PINMUX17, которая и не работает.


Там еще bootloader есть... По Reset именно в него входит процессор, и он что-то там делает согласно режима загрузки. По идее, если сделать Reset CPU через эмулятор, тогда процессор будет "в чистом состоянии", если же просто подключиться после подачи питания, то он прервет нечто, что исполняется в текущий момент, в каком-то неясном состоянии.
AndrejM
Цитата(SAURIS GmbH @ Jun 26 2014, 06:15) *
Там еще bootloader есть... По Reset именно в него входит процессор, и он что-то там делает согласно режима загрузки. По идее, если сделать Reset CPU через эмулятор, тогда процессор будет "в чистом состоянии", если же просто подключиться после подачи питания, то он прервет нечто, что исполняется в текущий момент, в каком-то неясном состоянии.


для чистоты экспериментов , у bootloader есть режим Emulation Debug если его установить (boot mode pins) то после reset ничего вообще исполняться не будет в ожидании коннекта через jtag
doom13
Цитата(SAURIS GmbH @ Jun 26 2014, 06:15) *
Там еще bootloader есть... По Reset именно в него входит процессор, и он что-то там делает согласно режима загрузки. По идее, если сделать Reset CPU через эмулятор, тогда процессор будет "в чистом состоянии", если же просто подключиться после подачи питания, то он прервет нечто, что исполняется в текущий момент, в каком-то неясном состоянии.

Подключаюсь, заливаю прошивку, делаю CPU Reset (рис. 1).
Подключаюсь, заливаю прошивку, делаю CPU Reset, Restart (рис. 2).
Цитата(AndrejM @ Jun 26 2014, 06:46) *
для чистоты экспериментов , у bootloader есть режим Emulation Debug если его установить (boot mode pins) то после reset ничего вообще исполняться не будет в ожидании коннекта через jtag

Счас ещё раз проверю, но этот режим и устанавливали.

Цитата(doom13 @ Jun 26 2014, 09:34) *
Цитата(AndrejM @ Jun 26 2014, 06:46) *

для чистоты экспериментов , у bootloader есть режим Emulation Debug если его установить (boot mode pins) то после reset ничего вообще исполняться не будет в ожидании коннекта через jtag

Счас ещё раз проверю, но этот режим и устанавливали.

BOOT[7:0] = 0001_1110, что и соответствует Emulation Debug.



Ну и вопрос тогда, кто мог переключить режим из Supervisor mode в User mode?

Цитата(SAURIS GmbH)

Поставил, как и ранее, точку останова, через ARM Advanced Features установил MMU Enabled, поменял значение ARM Mode на Supervisor Mode, убрал MMU Enabled, всё заработало! Регистр PINMUX и пишется и читается, проблема, как Вы и говорили, в режиме User Mode.
jcxz
Цитата(doom13 @ Jun 26 2014, 14:05) *
Ну и вопрос тогда, кто мог переключить режим из Supervisor mode в User mode?

Писал об этом недавно в соседней ветке (по DSP) одному товарищу....
Сталкивался с подобным давно (года 3 назад когда начинал с OMAP L137) на ARM9-ядре.
И обнаружил тогда, насколько помню, что user mode включается в стартап-коде от TI.
Потом в функции main(), когда необходим режим с привилегиями, переключался в него через SVC
(на котором висел соответствующий сервис).
Я пофиксил это поправив cstartup.

Попробуйте поставить бряк до cstartup и проверьте режим.
doom13
Цитата(jcxz @ Jun 26 2014, 16:17) *

Уже немного разобрался, как сделать чтобы не произошло переключения в User Mode. Начал с анализа проекта от TI, в CMD у них прописана своя точка входа
Код
-e Entry

переделал немного их проект под использование SHRAM (там DDR для кода используется), при остановке в начале main смотрю в каком режиме ARM и вижу System Mode, что отличается от моего. Далее нашёл в папках с их либой кто такой Entry, оказалось в их примере до выполнения main выполняется кусок асма со строчками описывающими переключение режимов. Далее идёт переключение на start_boot() из файла startap.c и только потом запускается main. Всё это у них работает с использованием уже скомпилированных библиотек, к проекту подключено два файла (всё остальное через LIB) и явно не видно, что до main ещё исполняется куча кода. После подключения их init.asm, изменения точки входа и либу одну их скомпиленную заюзал (надо будет потом выкинуть, чтоб понятно было, что и откуда берётся) всё заработало и моя проблема с записью PINMUX решилась.

Цитата(jcxz @ Jun 26 2014, 16:17) *
Сталкивался с подобным давно (года 3 назад когда начинал с OMAP L137) на ARM9-ядре.
И обнаружил тогда, насколько помню, что user mode включается в стартап-коде от TI.

Тут не совсем понимаю, каким образом что-то может подключиться к проекту (стартап-код) если у меня один файл с main и больше ничего, в настройках проекта пусто, CMD стандартный? Откуда берётся этот стартап?
jcxz
Подключиться "что-то" может только вашими руками sm.gif
Вы же указываете наверняка "подключать стандартные библиотеки" или что-то в этом роде.
Вот там оно и находится.
От вектора сброса протрассируйте и увидите что-нить типа: LDR PC, _cstartup
Внутри - инициализация всяких сишных переменных/классов и переключение в этот user mode кроме всего прочего.
Находите исходник стандартной либы (есть в CCS), правите его убирая всякую шнягу типа включения user mode и пр.,
компилите в lib-файл и включаете в проект вместо "стандартной либы".
SAURIS GmbH
Цитата(doom13 @ Jun 26 2014, 18:17) *
Тут не совсем понимаю, каким образом что-то может подключиться к проекту (стартап-код) если у меня один файл с main и больше ничего, в настройках проекта пусто, CMD стандартный? Откуда берётся этот стартап?


Вот этот стартап-код инициализирует run-time библиотеку, после чего вызывает Ваш main. Он находится в виде исходных текстов в составе run-time библиотеки. Вы его можете оттуда выковырять и поправить на свой лад, если надо. Но без него нельзя - он много чего делает, чтобы Ваш C-код исполнялся потом корректно.
doom13
Да, ступил немного. Просто в голове работа с С2000, С6000, а там как-то всё время к проекту подключался асмовский файл (буквально пару строк) с переходом на _c_int00. Вот что-то мне запомнилось, что переход на _c_int00 и есть переход на main, ещё раз прошёлся по старым проектам, оказалось - переход на _c_int00 не равен переходу на main. При переходе на _c_int00 ещё куча асмовских инструкций исполняется и только потом осуществляется переход на main. Счас стало понятно, надо только этот стандартный startup выщимить и посмотреть, что он там выполняет.
SAURIS GmbH
Есть еще один вариант. Если остальная программа, кроме инициализации, может полностью работать в user mode, то можно написать свой кусочек кода, работающий без единого библиотечного вызова и без использования стека (вызова ф-ций) (а лучше вообще, на ассемблере), который проинициализирует все регистры, доступные только из privileged, и затем уйдет на библиотечный стартап, и далее на main. Ну и точку входа переустановить на начало этого кода.
doom13
Цитата(SAURIS GmbH @ Jun 27 2014, 09:55) *
Есть еще один вариант. Если остальная программа, кроме инициализации, может полностью работать в user mode, то можно написать свой кусочек кода, работающий без единого библиотечного вызова и без использования стека (вызова ф-ций) (а лучше вообще, на ассемблере), который проинициализирует все регистры, доступные только из privileged, и затем уйдет на библиотечный стартап, и далее на main. Ну и точку входа переустановить на начало этого кода.

Счас вот разбираюсь, как тут правильно стартануть, нашёл boot.asm со стандартной _c_int00, оно и выполнялось до моего main. Только вот точку останова в нём почему-то не могу поставить.
SAURIS GmbH
тут два варианта - пересобрать библиотеку целиком с включением отладочной информации в нее, ну или включить этот boot.asm (его копию) в состав своего проекта.
doom13
Цитата(SAURIS GmbH @ Jun 27 2014, 10:59) *
тут два варианта - пересобрать библиотеку целиком с включением отладочной информации в нее, ну или включить этот boot.asm (его копию) в состав своего проекта.

Попробовал его подключать, одного выходит не достаточно, тянет за собой ещё что-то. Наверное проще оставить свой entry point по аналогии с примером от TI, только полностью разобраться, что он там делает.


Есть две практически одинаковые конфигурации. При запуске и загрузке программы попадаем в main, в стеке вызовов лежит _c_int00 и main. Если выбрать _c_int00, то для первой напишет, что не может открыть исходный файл, для второй автоматом откроет boot.asm. В чём может быть разница? Что-то никак не могу найти отличия, для второй хотя бы понятно, откуда _c_int00 берётся.
SAURIS GmbH
Цитата(doom13 @ Jun 27 2014, 13:07) *
Попробовал его подключать, одного выходит не достаточно, тянет за собой ещё что-то. Наверное проще оставить свой entry point по аналогии с примером от TI, только полностью разобраться, что он там делает.


Должно быть достаточно. Я не раз так делал, когда требуется модификация boot.asm, компилятор компилирует тот, что в проекте, а тот, что в либе, игнорирует. Что касается останова в нем - надо где-то в опциях проекта (или отладки, не помню) убрать галку, говорящую, что надо автоматически дойти до main и остановиться на ней. Тогда она сразу остановится на _c_int00

Разница, наверное, что один проект видит файл "boot.asm" - он лежит или в проекте, или где-то в путях доступен, а второй нет.


UPD:

Вдогонку.

Еще можно раскрыть весь архив с исходниками runtime library, и добавить в путь поиска отладчику. Но с учетом того, что либа собрана с оптимизацией, остановы в C коде могут быть показаны некорректно.
doom13
Цитата(SAURIS GmbH @ Jun 27 2014, 13:02) *
Разница, наверное, что один проект видит файл "boot.asm" - он лежит или в проекте, или где-то в путях доступен, а второй нет.

Проект отин и тот же только Debug Configurations разные запускаю, но по опциям они одинаковые, ну может не вижу чего.
Цитата(SAURIS GmbH @ Jun 27 2014, 13:02) *
Что касается останова в нем - надо где-то в опциях проекта (или отладки, не помню) убрать галку, говорящую, что надо автоматически дойти до main и остановиться на ней. Тогда она сразу остановится на _c_int00

Да, заработало. Я пытался поменять Run to symbol main на Run to symbol _c_int00, а надо было убрать галку. Стало заходить в boot.asm, но пошагово отследить, что и за чем следует, как Вы и говорите, нельзя, прыгает по чём попало и по коментам тоже.
Цитата(SAURIS GmbH @ Jun 27 2014, 13:02) *
Должно быть достаточно. Я не раз так делал, когда требуется модификация boot.asm, компилятор компилирует тот, что в проекте, а тот, что в либе, игнорирует.

Вот если boot.asm, который и открывается для одной из конфигураций, закинуть в проект или импортировать как File system -> link in workspace, то появляется такая вот ошибка:
SAURIS GmbH
Это похоже какие-то опции сборки надо поставить (например -D <define>) для boot.asm, чтобы она не вызывала эту инициализацию xdc.


UPD:
Хотя... В исходнике "boot.asm" такого идентификатора не видно. Так что похоже Вы сами что-то туда лишнее еще притащили.

UPD2: Более того, во всей run time поиск по всем исходникам не дал ничего на тему этого символа.

UPD3:

А Вы откуда этот boot.asm вообще взяли? Надо из ccsvX\tools\compiler\arm_X.X.X\lib\src\boot.asm
doom13
Цитата(SAURIS GmbH @ Jun 27 2014, 13:23) *
Это похоже какие-то опции сборки надо поставить (например -D <define>) для boot.asm, чтобы она не вызывала эту инициализацию xdc.
UPD:
Хотя... В исходнике "boot.asm" такого идентификатора не видно. Так что похоже Вы сами что-то туда лишнее еще притащили.
UPD2: Более того, во всей run time поиск по всем исходникам не дал ничего на тему этого символа.
UPD3:
А Вы откуда этот boot.asm вообще взяли? Надо из ccsvX\tools\compiler\arm_X.X.X\lib\src\boot.asm

В том, который автоматом открывается что-то такое есть. Он открывается из c:\ti\xdctools_3_25_03_72\packages\ti\targets\arm\rtsarm\boot.asm
SAURIS GmbH
Цитата(doom13 @ Jun 27 2014, 14:42) *
В том, который автоматом открывается


Это XDC runtime - совсем и близко не то. Тот... Ну я уже сказал, где лежит
doom13
Цитата(SAURIS GmbH @ Jun 27 2014, 13:43) *
Это XDC runtime - совсем и близко не то. Тот... Ну я уже сказал, где лежит

Счас попробую прикрутить Ваш, но какого оно тогда его подтягивает и, когда галку с main убрал, в него и заходит?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.