|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 1:42 am
|
Страница 1 от 1
|
[ 12 мнения ] |
|
CCS при pic18F452 мине ли 73% рама почват проблемите
| Автор |
Съобщение |
|
forest_gump
Ранг: Професионалист
Регистриран на: Сря Окт 13, 2004 11:24 pm Мнения: 500 Местоположение: Стара Загора
|
 CCS при pic18F452 мине ли 73% рама почват проблемите
Здравейте на всички, много интересен проблем констатирах наскоро със pic18f452 и компилатор за него CCS, когато мине 73% заетоста на рама по някакъв необясним начин започва да меши променливите, примерно тези които са глобални , до момента във който рама е зает на по-малко от 73% нещата биват, прибавям нещо което по никакъв начин не променя работата на останалият код примерно създавам и инклудвам нов сорс файл и в него дефинирам буфер който дори и не използвам, заетоста на рама минава 73% и се наблюдава омешване на променливите но по-странното е че само определени променливи омешва тези които са дефинирани във основният сорс файл на проекта. Махам/закоментарвам прибавеното и след това нещата се оправят. Нямам дебъгване, намам и WDT, има прекъсвания но са от кодер и по време на омотването не ги активирам. Пробвах със няколко версии на компилатора и резултата е един и същ. Допускам че може и аз греша някъде, кода стана много тлъст но за сметка на това доста непрегледен  .
С две думи ако никой не е наблюдавал подобно явление значи аз съм осрал някъде нещата 
|
| Пет Сеп 14, 2007 10:56 pm |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
Как разбра, че омешва променливите, а не е нещо друго?
|
| Пет Сеп 14, 2007 11:12 pm |
|
 |
|
forest_gump
Ранг: Професионалист
Регистриран на: Сря Окт 13, 2004 11:24 pm Мнения: 500 Местоположение: Стара Загора
|
@Бате, дали омешва и друго не си направих труда да ровя, устройството е със LCD бутони и менюта, имам указатели /глобални променливи/ които сочат текущите прозорци и разните му там фунции на бутоните, като стане кашата всичко се обърква , указателите сочат каквото им падне и съответно се отварят произволни менюта и т.н. Имам дебъгер ICD (C)-Pirev, но имам някакъв проблем по който сега се ровя и не мога да дебъгвам никакви пикове от 18-та серия.
|
| Съб Сеп 15, 2007 2:24 pm |
|
 |
|
setoy
Ранг: Почетен член
Регистриран на: Пет Фев 17, 2006 9:17 am Мнения: 765 Местоположение: Стара Загора
|
Махни оптимизациите на местата, за които се съмняваш, може да помогне. #opt 0 и #opt 7-8 за останалите места. Имам някакво смътно усешане, че ако ползваш #locate на определени места в кода и паметта почне да намалява... но не е потвърдено още на 100%. И кажи какво е станало 
|
| Съб Сеп 15, 2007 2:39 pm |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
ICD-тата се скапват в режим дебъгване, пък и в програмиране, ако имаш голям кондезатор на MCLR пина, или външно куче. Ориентиоравачно, 47-100k & 10-100nF на MCLR са приемливи стойности за да влезне в режим дебъгване/програмиране.
"Омазване" на променливите може да се случи, ако дефинираш твои с #locate и/или #byte и същевременно оставиш компилатора и той да си заделя памет за автоматични променливи. Погледни в листинг файла, кои променливи се препокриват и направи размествания в #locate & #byte дефинициите, или ги премахни напълно и остави компилатора да си заделя сам паметта.
Интересно ми е, да споделиш какво е станало.
_________________ Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
|
| Съб Сеп 15, 2007 3:08 pm |
|
 |
|
dumfree
Ранг: Ориентиран
Регистриран на: Пет Юли 01, 2005 10:46 pm Мнения: 229 Местоположение: Гложене/София
|
А възможно ли е стека да стига до променливите и от там да става омазването.
На мен ми разказваха за такъв случай.
|
| Съб Сеп 15, 2007 3:59 pm |
|
 |
|
setoy
Ранг: Почетен член
Регистриран на: Пет Фев 17, 2006 9:17 am Мнения: 765 Местоположение: Стара Загора
|
Пише, че заделените с #locate променливи не би трябвало да ги припокрива. Обаче имам чувството, че не винаги май е така. Има ли шанс да съм прав? И какво в този случай? #reserve ?
|
| Съб Сеп 15, 2007 4:16 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Има такава вероятност, правил съм го с #reserve и нямах проблеми, мое мнение е да избягваш такива дефиниции в CCS като цяло, че при всяка следваща версия на компилатора има някакви несъответствия (явно недокоментирани)
|
| Нед Сеп 16, 2007 10:30 am |
|
 |
|
Yanek
Ранг: Новодошъл
Регистриран на: Пет Юни 29, 2007 10:59 pm Мнения: 113
|
Омазването за което споменаваш би могло да се случи, но не на процесор от типа на пика. Там както знаеш стека е хардуерен, а другият който компилатора организира е с предварително запазване на РАМ-а и би изпищял веднага. Това за което говориш на мен лично се е случвало на стари IAR компилатори за MSP430. При новите версии ти изплюва съобщение за достигната процентна граница от стека. При условие, че не променяш адреса на стека, разбира се.
|
| Нед Сеп 16, 2007 4:21 pm |
|
 |
|
Gogo
Ранг: Форумен бог
Регистриран на: Чет Фев 24, 2005 11:41 pm Мнения: 1049 Местоположение: Pz
|
|
| Нед Сеп 16, 2007 10:20 pm |
|
 |
|
gicho
Ранг: Форумен бог
Регистриран на: Пон Мар 13, 2006 1:59 pm Мнения: 3867 Местоположение: Габрово
|
Не познавам тоя компилатор, ама звучи точно като недостатъчно стек. Пробвай да премахнеш някой вътрешни променливи и да ги изнешен като глобални, както и да предаваш по-малко аргументи на функциите.
Не знам как някой компилатор би могъл да сметне колко стек ще му трябва по време на компилирането - така може да се завърти изпълнението, че да не знае. Особено ако се използват библиотечни функции - например printf / sprints използват вътрешно динамично заделяне и могат да отлюштят стотина байта RAM.
При атмел / gcc стека е от края на рама надолу докъдето стигне и нищо не може да те спаси от това, да стигне до последните променливи в рама. На пик ще е подобно, просто няма хардуерна защита от разпростиране на стека.
|
| Пон Сеп 17, 2007 8:38 am |
|
 |
|
forest_gump
Ранг: Професионалист
Регистриран на: Сря Окт 13, 2004 11:24 pm Мнения: 500 Местоположение: Стара Загора
|
В проблема се оказа че има вина задкормилното у-во, сиреч аз, получава се настаняване на масив от типа:
върху променлива за която е заделена памет от компилатора някъде в съседство на масива , и във хелпа си пише че "sprintf" не проверява за размера на буфера но кой да прочете, но поради някаква причина когато паметта се заеме до определено ниво както в моя случай например това се оказва фатално.
|
| Чет Сеп 20, 2007 7:34 pm |
|
|
|
Страница 1 от 1
|
[ 12 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 2 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|