Ошибки PC-Lint при использовании прямой регистрации адресов - PullRequest
3 голосов
/ 27 февраля 2012

У меня есть существующий код C (сторонний источник, я не могу его изменить), который не будет принят PC-Lint (версия 9.0). Код работает во встроенной среде, используется компилятор Green Hills.

Кто-нибудь знает, как настроить PC-Lint для принятия определения кода? Я приложил только сообщение об ошибке для первого члена в структуре.

Вот определения из заголовочного файла:

typedef struct  
{  
    uint32_t PINSEL0;  // see ERROR message from PCLint, line 153 in LPC23.h  
    uint32_t PINSEL1;  
    uint32_t PINSEL2;  
} LPC_PINCON_TypeDef;


#define LPC_PINCON_BASE           (0xE002C000)
#define LPC_PINCON                ((LPC_PINCON_TypeDef *) LPC_PINCON_BASE)

#define PINSEL_BASE_ADDR    0xE002C000
#define PINSEL0        (*(volatile unsigned long *)(PINSEL_BASE_ADDR + 0x00))


/**************************/

/* function in c-file */

void Port_Init()  
{

  LPC_PINCON->PINSEL0 &= ~(3 << 4); //p0.2  

  LPC_PINCON->PINSEL0 |=  (1 << 4); // 

  LPC_PINCON->PINSEL0 &= ~(3 << 6); //p0.3  

  LPC_PINCON->PINSEL0 |=  (1 << 6); // 

  // etc................  
 }

/*******************************************/

  //    ERRORS from PC-Lint    
  //   **********ERROR MESSAGES**************

  #... (volatile unsigned long *)(PINSEL_BASE_ADDR + 0x00))
   uint32_t PINSEL0;
   LPC23.h  153  Error 10: Expecting identifier  

  #... BASE_ADDR + 0x00))  
   uint32_t PINSEL0;
   LPC23.h  153  Error 102: Illegal parameter specification  

  #... BASE_ADDR + 0x00))
   uint32_t PINSEL0;
   LPC23.h  153  Error 10: Expecting ';'

Ответы [ 3 ]

5 голосов
/ 27 февраля 2012

Отрывок из PC-lint FAQ :

Как мне сказать lint, чтобы он не жаловался на заголовки моего компилятора?

Lint использует метку заголовка "library" для обозначения тех заголовков, над которыми у программиста нетуправление (например, заголовки компилятора).По умолчанию все #include из стороннего каталога или заключенные в <> считаются «библиотекой».Это можно изменить с помощью параметра +libclass и дополнительно настроить с помощью параметров +/-libdir и +/-libh.
Затем можно использовать параметры -wlib, -elib и -elibsymконтролировать только те сообщения, которые отправляются из библиотечных заголовков.Файлы опций компилятора, распространяемые с PC-lint, обычно содержат параметр -wlib(1), который ограничивает вывод lint из заголовков библиотеки только ошибками (подавляя предупреждающие и информационные сообщения).

Я полагаю, это должно соответствовать вашим потребностям.Если нет, то был бы полезен минимальный пример, который воспроизводит ваши предупреждения;все вышеперечисленное меня озадачивает, поскольку #define для PINSEL0 равен после его использования в качестве идентификатора в структуре.

2 голосов
/ 29 февраля 2012

Я предполагаю, что LPC_PINCON_TypeDef и макрос PINSEL0 взяты из или для разных ситуаций. Я надеюсь, что вам разрешено изменить одно или другое, поскольку определения находятся в непосредственном противоречии. Если я предполагаю, что сам код компилируется правильно, то оба определения никогда не используются одновременно в одной единице перевода, и PC Lint, вероятно, / возможно, использует неправильные настройки.

Я думаю, что вы, возможно, не предоставили Lint неявные определения макросов для компилятора. По крайней мере, макрос __ghs__ должен быть определен, используйте опцию -d__ghs__. И проверьте руководство для дальнейших вариантов.

Возможно, вы захотите проверить точные файлы и порядок их включения, используя опцию -vf (или для полноты вы можете использовать -vaif, чтобы проверить, какие местоположения поиска Lint использует для поиска включаемых файлов); но осторожно, вывод довольно большой и легко прокручивается за пределы окна и даже его буфера. Вероятно, лучше всего направить вывод в файл и проверить его позже.

И хотя я не решаюсь указывать на мой собственный веб-сайт, но если вы хотите, посмотрите на мой PDF «Как использовать PC Lint» , вы найдете простые шаги от нуля до правильной работы ваш код, используя PC Lint, со всеми опциями, которые нужно установить.

Если все не поможет, вам придется уточнить настройки, которые вы используете, и опции как для компилятора, так и для ПК Lint.

2 голосов
/ 29 февраля 2012

Если определение макроса #define PINSEL0 ... активно при компиляции функции Port_Init(), я не могу понять, как вы не получаете ошибок compiler . Кажется, должно быть что-то (#ifdef или что-то еще), которое отключает макрос PINSEL0 во время компиляции - это не обязательно (и вредно), если вы используете структуру LPC_PINCON_TypeDef для доступа к регистрам.

Вам нужно будет убедиться, что та же самая опция управления / макрос / все, что установлено при запуске шага lint.

Можете ли вы показать действительный файл LPC23.h (или указать на него где-нибудь в Интернете)? Похожий файл, который я нашел (http://www.keil.com/dd/docs/arm/philips/lpc23xx.h) использует только технику «прямого макроса» и не предоставляет LPC_PINCON_TypeDef метод доступа к элементам структуры.

...