реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Скрытый баг, О вреде копипасты
Genadi Zawidowsk...
сообщение Jul 3 2013, 06:24
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Столкнулся я с тем, что проект, ранее работавший на STM32F101, STM32F105 перестал работать на STM32F103 (буквочки не важны).
Вернее, проект работал, но "отваливался" дебаг порт SWD - помогала только загрузка через замыкание BOOT0. Радостно потирая руки, начал писать демонстрацию бага...
Внимательное чтение документации выявило причину.
Пока - код-загадка, который после программирования в STM32F103RC делал его "невидимым" для J-FLASH.

CODE
#include "stm32f10x.h"

#define STACK_SIZE 0x600

static __attribute__ ((aligned(8), section(".noinit"))) uint32_t pdwStack [STACK_SIZE] ;

typedef void IntFunc(void);
typedef IntFunc * IntFuncP;

static IntFunc ResetException;


static
__attribute__((used, section(".vectors"))) IntFuncP exception_table [256] = {

(IntFuncP) (& pdwStack [STACK_SIZE]),
ResetException,
};


static void ResetException(void)
{
/* Используется только SWD */
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
AFIO->MAPR = (AFIO->MAPR & ~ AFIO_MAPR_SWJ_CFG) | AFIO_MAPR_SWJ_CFG_JTAGDISABLE; // PA15, BP3 & PB4 pins free for use.

/* ... много кода */
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
AFIO->MAPR |= AFIO_MAPR_SPI1_REMAP;
/* ... инициализация SPI1 */

/* ... много кода */
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; /* I/O port B clock enable */
// Set PB3 as output
GPIOB->CRL = GPIO_CRL_CNF3_0;


/* ... много кода */
for (;;)
;
}



ps: вот тут
мучаются с похожей проблемой, но не нашли решения...


Сообщение отредактировал Genadi Zawidowski - Jul 3 2013, 07:01
Go to the top of the page
 
+Quote Post
SSerge
сообщение Jul 3 2013, 07:45
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(Genadi Zawidowski @ Jul 3 2013, 13:24) *
...
Внимательное чтение документации выявило причину.
...

Это всегда помогает.
"Bits 26:24 SWJ_CFG[2:0]: Serial wire JTAG configuration
These bits are write-only (when read, the value is undefined)."

P.S. Хорошие грабли, я по ним уже ходил sm.gif.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 3 2013, 08:18
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(SSerge @ Jul 3 2013, 11:45) *
P.S. Хорошие грабли, я по ним уже ходил sm.gif.
Да неплохие.
В очередной раз убеждаюсь в правильности выбора использования STM32 библиотеки для настройки периферии...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Tahoe
сообщение Jul 3 2013, 13:21
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600



Цитата(demiurg_spb @ Jul 3 2013, 12:18) *
В очередной раз убеждаюсь в правильности выбора использования STM32 библиотеки для настройки периферии...

Расскажите вы ей... (с)

Как я по этим граблям прошелся.
Цитата(Tahoe)
В общем вывод остается прежним - remap JTAG делать в самую последнюю очередь.
А в библиотеках от ST просто в наглую подставляется константа. И совсем не факт, что она совпадет с тем, как ранее настроил программер.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Jul 3 2013, 19:04
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Я решил просто - свой функцией, которая подставляет нужную мне константу в каждому обращению к ремапу.
Первое обращение с маской "0", для настройки SWD, если ремапа не окажется.
Честно говоря, я удивлён что эти грабли такие истоптанные... Всегда хочется верить в уникальность своих проблем.

Сообщение отредактировал Genadi Zawidowski - Jul 3 2013, 19:05
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Jul 3 2013, 20:20
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата
P.S. Хорошие грабли, я по ним уже ходил

Но почему _почти все_ примеры просто OR-с присвоением используют? И ведь, наверное, в серийных устройствах такое тоже оказывается. Вопрос риторический. Интернет не заменяет даташит, это понятно. Как и "русская инструкция для начинающих".
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jul 3 2013, 22:17
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(Genadi Zawidowski @ Jul 4 2013, 00:20) *
Но почему _почти все_ примеры просто OR-с присвоением используют? И ведь, наверное, в серийных устройствах такое тоже оказывается. Вопрос риторический. Интернет не заменяет даташит, это понятно. Как и "русская инструкция для начинающих".

либы "индусы" пишут. Им фиолетово, а контроль либо не успевает, либо тоже "индусский"

я со старыми-то либами к арм9 плясал, пока сам не разобрался и свое не разродил... вроде и проект не особо важный, но спортивный интерес свое взял


Короче говоря, смотри, изучай и пиши сам sm.gif

Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jul 4 2013, 06:48
Сообщение #8


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(demiurg_spb @ Jul 3 2013, 11:18) *
В очередной раз убеждаюсь в правильности выбора использования STM32 библиотеки для настройки периферии...


Цитата(toweroff @ Jul 4 2013, 01:17) *
Короче говоря, смотри, изучай и пиши сам sm.gif


Сколько людей - столько и мнений, как всегда.
Есть еще одно мнение sm.gif - все, что касается статического конфига, зависящего только от конкретной платы - записывать сразу, с минимумом манипуляций регистрами.
Я понимаю, - вкл/выкл модуль и уменьшить потребление - этого не избежать, но применять этот подход всегда - не получается.
Go to the top of the page
 
+Quote Post
Tahoe
сообщение Jul 4 2013, 08:26
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600



Цитата(Genadi Zawidowski @ Jul 3 2013, 23:04) *
Я решил просто - свой функцией, которая подставляет нужную мне константу в каждому обращению к ремапу.

ИМХО, лучше всего и правильнее воспользоваться такой фичей кортекса, как bitbang. "И сразу станет от этого хорошо."(с)

Цитата(_Pasha @ Jul 4 2013, 10:48) *
все, что касается статического конфига, зависящего только от конкретной платы - записывать сразу, с минимумом манипуляций регистрами

Так прокатит только в одном случае, если писать быдлокод. А если писать нормально, с возможностью reuse, тогда никаких статических конфигов не получится, даже на самом мелком AVR.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jul 4 2013, 08:43
Сообщение #10


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Tahoe @ Jul 4 2013, 11:26) *
Так прокатит только в одном случае, если писать быдлокод. А если писать нормально, с возможностью reuse, тогда никаких статических конфигов не получится, даже на самом мелком AVR.

a14.gif Reuse периферии... оригинально!
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Jul 4 2013, 10:43
Сообщение #11


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата(_Pasha @ Jul 4 2013, 12:43) *
a14.gif Reuse периферии... оригинально!


А что, для Вас это новость? Я давно во всех своих проектах использую что-то вроде "bios" с инициализацией (как минимум) разных модулей - причём, платформы arm7-arm9(atmel), cortex-m3 (atmel, stm), atmega... http://subversion.assembla.com/svn/hfreciever/trunk/
Go to the top of the page
 
+Quote Post
Tahoe
сообщение Jul 4 2013, 11:05
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600



Цитата(_Pasha @ Jul 4 2013, 12:43) *
a14.gif Reuse периферии... оригинально!

Вообще-то reuse кода. А какого именно - инициализирующего периферию или декодирующего biphase - дело десятое. Дело в подходе к кодированию, а не к тому, что именно кодируешь в данный момент.

Цитата(Genadi Zawidowski @ Jul 4 2013, 14:43) *
Я давно во всех своих проектах использую что-то вроде "bios" с инициализацией

Я даже имел в виду несколько шире:
Код
void    RFID_Init(        RFID    *        pRfid        )
{
    BIPHASE_Init( &( pRfid->Decoder ) );
    BSP_U2270_Init();
}

void    BSP_U2270_Init( void )
{
    MCU_PIN_Cfg(            BSP_PIN_U2270_ENBL,        MCU_PIN_MODE_OUT_PUSHPULL    );
    MCU_PIN_Cfg(            BSP_PIN_U2270_ADJ,        MCU_PIN_MODE_OUT_PUSHPULL    );
}

e.t.c.


Т.е. всегда есть некий верхний модуль, который по иерархии вниз обращается. В какой момент времени это произойдет - никому неизвестно. И если, допустим, на общем SPI сидит два устройства, с разной скорострельностью, то при обращении придется перенастраивать baud rate. Хотя Паша, конечно, просто тупо проинициализирует в самом начале, на самую меденную скорость. И даже, скорее всего, будет собой очень доволен - еще бы, сэкономил пару байт флеша.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jul 4 2013, 13:37
Сообщение #13


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Tahoe @ Jul 4 2013, 14:05) *
Хотя Паша, конечно, просто тупо проинициализирует в самом начале, на самую меденную скорость. И даже, скорее всего, будет собой очень доволен - еще бы, сэкономил пару байт флеша.

Чушь котячья. Я такого не сказал.
Скажу по-умному шоб зауважали sm.gif
Write-once registers. Знаете такой термин? Вот.
Go to the top of the page
 
+Quote Post
Tahoe
сообщение Jul 4 2013, 14:12
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600



Цитата(_Pasha @ Jul 4 2013, 17:37) *
Чушь котячья. Я такого не сказал.
Скажу по-умному шоб зауважали sm.gif
Write-once registers. Знаете такой термин? Вот.

Прекрасно. Подозреваю, что человек, который в R/W регистр пишет лишь один раз, навернное и флешовый микроконтроллер выпаивает после первой же прошивки, заменяя его на новый? Любовь к целк ко всему девственно чистому? Или one more once not a pidarance? sm.gif
Go to the top of the page
 
+Quote Post
Fujitser
сообщение Jul 7 2013, 05:23
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 294
Регистрация: 28-02-05
Из: Екатеринбург
Пользователь №: 2 925



Быдлокод и возможность reuse - это совершенно ортогональные понятия. Можно написать библиотеку с быдлокодом, можно написать статическую конфигурацию правильно и хорошо.
Хотя я за библиотеки.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 00:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01504 секунд с 7
ELECTRONIX ©2004-2016