2015-01-12 7 views
3

Я использую LCDK C6748 из Texas Intruments с Code Composer Studio и TMDSEMU100V2U-14T - XDS100v2 USB JTAG эмулятора.точки останова внутри прерывания C

LCDK поставляется с множеством функций поддержки, включая функцию, которая инициализирует плату и определяет, какие функции обратного вызова вызываются для каждого прерывания.

Я только что реализовал функцию обратного вызова, поэтому он делает что-то, когда новый образец поступает из АЦП.

Я попытался установить контрольную точку внутри прерывания, но во время выполнения программы поток не попадал туда.

Кроме того, я сделал что-то проще:

volatile int flag = 0; 


interrupt void interrupt4(void) // interrupt service routine 
{ 
    flag = 1; 
    return; 
} 

int main(){ 
    // board initializing function, defining sampling rate etc. 
    L138_initialise_intr(FS_48000_HZ,ADC_GAIN_0DB,DAC_ATTEN_0DB); 

    while(1){ 
     if (flag == 1){ 
      printf("interrupt entered"); 
      flag = 0; 
     } 
    } 
} 

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

это меня удивило, потому что, если я не установил точку останова, прерывание вводится непрерывно. Я попытался просто передать образцы в линию громкоговорителей, не делая ничего другого, и я услышал музыку.

У меня такое ощущение, что я пропускаю что-то очень важное о прерываниях, я совершенно новичок в этой теме.

Может кто-то пожалуйста, объясните мне [или мне ссылку на хороший источник, который объясняет, как mechnism работает в DSP]:

1) почему мы не можем установить контрольную точку внутри прерывания?

2) почему даже если я установил точку останова в основном, кажется, что прерывание не происходит, и если я этого не сделаю.

3) каким образом я должен иметь доступ к переменным во время выполнения, в CCS?

благодаря

+0

Очевидное, что для меня все равно, что вы должны вводить цикл while, если флаг 'flag == 1' является истинным, на протяжении всей программы. Тогда возникает вопрос, уверены ли вы в том, что область «volatile int flag» действительно глобальна? Вы подтвердили, что поток выполнения _always_ возвращается из 'L138_initialise_intr'? – ryyker

+0

как реализация обратного вызова, так и основной находятся в одном файле .c и объявлен флаг: volatile int flag = 0; в голове его –

+0

Можете ли вы разместить соответствующие части своего обратного вызова? (все это, если оно не слишком велико). Если вы установите флажок = flag, то может возникнуть возврат к ошибке. Это было бы причиной того, что вы никогда не вводите 'while (...)' в 'main()'. – ryyker

ответ

2
  1. Попробуйте положить точку останова, а затем запустить. см., если он попадает по крайней мере один раз. Если это так, то ваш источник прерываний не будет очищен автоматически [потому что вы не делаете этого явно внутри ISR]. в контроллере TI они ожидают, что вы очистите путь ISR для получения следующего по моему опыту.
  2. Если вы не получили даже 1-го прерывания времени, проверьте сборку, сгенерированную для ISR, и оптимизацию, выполненную компилятором.

  3. Хотя, возможно, вам придется увидеть защиту времени и глобальной переменной позже, в случае конфликтов, но на данный момент выше 2 предложения.

2

Я думаю, что это прерывание является таймер прерываний. Во многих случаях jtag, когда срабатывает точка останова, останавливает много модулей MPU/DSP, но таймер продолжает работать. Это вызывает переполнение таймера, это означает, что флаг переполнения установлен, и прерывание никогда не будет вызываться до тех пор, пока флаг не будет сброшен.

Я не знаю, можете ли вы установить jtag для остановки таймеров также при срабатывании точки останова. С freescale MPU, IAR IDE и segger jtag я могу.