|
Начальная инициализация статических переменных. |
|
|
|
Jul 9 2012, 06:36
|
Участник

Группа: Участник
Сообщений: 71
Регистрация: 17-01-12
Пользователь №: 69 604

|
Среда - Keil Arm. Контроллер STM32F103. В Keil имеется функция SystemInit(), которая выполняется перед main().
Описание эффекта. В функции SystemInit() инициализируется несколько указателей-параметров объекта. При входе в функцию main() эти параметры обнуляются.
Вопрос. Что это? Возможно начальная инициализация статических переменных происходит после выполнения SystemInit()? Не похоже. Какие-то "заморочки со стеком?" может я какую-то "галочку" в опциях проекта не поставил?
|
|
|
|
|
Jul 9 2012, 07:09
|
Участник

Группа: Участник
Сообщений: 71
Регистрация: 17-01-12
Пользователь №: 69 604

|
Цитата(ViKo @ Jul 9 2012, 09:49)  Например? typedef struct TExtADCResult { bool Exist; unsigned long Value; } TExtADCResult; typedef struct TExtADC { TSPI *SPIPtr; void (*Select)(void); void (*Unselect)(void); void (*Start)(void); void (*Stop)(void); bool (*Ready)(void); void (*Reset)(void); TExtADCResult Result[8]; bool Exist; } TExtADC; #define ExtADC_CHAN_NUMBER 2 TExtADC ExtADCChanel[ExtADC_CHAN_NUMBER]; void SystemInit(void) { PeriferInit(); } void PeriferInit(void) { TExtADC_Create(&ExtADCChanel[0],&SPIChanel[0],&ExtADC1_Select,&ExtADC1_Unselect,&ExtADC_Start,&ExtADC_Stop,ExtADC1_Ready,ExtADC_Reset); TExtADC_Create(&ExtADCChanel[1],&SPIChanel[0],&ExtADC2_Select,&ExtADC2_Unselect,&ExtADC_Start,&ExtADC_Stop,ExtADC2_Ready,ExtADC_Reset); } В TExtADC_Create() идёт обыкновенное присвоение указателям ссылок на функции. Смотрю объект ExtADCChanel[0].
|
|
|
|
|
Jul 9 2012, 07:36
|
Участник

Группа: Участник
Сообщений: 71
Регистрация: 17-01-12
Пользователь №: 69 604

|
Цитата(ViKo @ Jul 9 2012, 10:30)  Смотрите, что есть в startup. Код Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT SystemInit IMPORT __main LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 ENDP Видите __main - вот там все и устанавливается. Вы сами добавили кода в SystemInit()? А чем не устроило сделать это в main? Вот мой startup: Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT __main IMPORT SystemInit LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 ENDP По-моему не отличается ничем.
|
|
|
|
|
Jul 9 2012, 08:05
|
Участник

Группа: Участник
Сообщений: 71
Регистрация: 17-01-12
Пользователь №: 69 604

|
Цитата(ViKo @ Jul 9 2012, 10:50)  И это правильно. Еще раз прочитайте мой ответ.
Не "не похоже", а именно так! Не понял, а где именно выполняется инициализация переменных? Где вызов подпрограммы? В приведенном ассемблерном коде я его не вижу. Ну и что из того, что сначала выполняется SystemInit(), а потом main()? Или инициализация выполняется в начале работы main()?
|
|
|
|
|
Jul 9 2012, 08:20
|
Участник

Группа: Участник
Сообщений: 71
Регистрация: 17-01-12
Пользователь №: 69 604

|
Цитата(ViKo @ Jul 9 2012, 11:11)  где же main(), если __main()? А... Теперь понял. Спасибо, учту в программе.
|
|
|
|
|
Jul 11 2012, 04:58
|
Участник

Группа: Участник
Сообщений: 71
Регистрация: 17-01-12
Пользователь №: 69 604

|
Цитата(kan35 @ Jul 10 2012, 13:16)  в 20х числах июня, Томас Дреслер из ST совместно с дистрибьюторами проводил семинары (Москва, Питер, Ебург) на тему STM32F4... и как раз это все разжевал. Многие при этом возмущались - зачем типа нам это все знать. В том числе почему SystemInit вызывается до __main и что еще инициализируется в __main... С удовольствием съездил бы послушал. Но попасть на эти семинары в те города, которые Вы перечислили, из моего провинциального украинского городка и небольшой частной фирмы - это всё равно, что слетать на Луну. Так что пока единственное спасение - это вот такие конференции и бескорыстная помощь моих уважаемых коллег.
|
|
|
|
|
Jul 12 2012, 04:11
|
Знающий
   
Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594

|
Цитата(AHTOXA @ Jul 12 2012, 01:10)  А по-моему, всё гораздо проще. SystemInit - это от ST, а __main - от кейла. И ST банально не может вызвать SystemInit после __main, потому что оттуда нет возврата  Эти рассуждения не выдерживают никакой критики. Почему бы тогда по вашей логиге банально не вызывать SystemInit в сомом main()? Инициализация на 16МГц и на 168МГц - чувствуете разницу?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|