23.05.2011, 02:42. Просмотров 928. Ответов 0
C++ |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| void Dispatch(){
if (gRunTask.entry != NULL){
if (setjmp(gE) != 0)
return;
*gRunTask.env = *gE;
gRunTask.jmp = true;
}
if(gRunTask.entry == NULL){
if(gReadyTask.begin() == gReadyTask.end()){
//нет задач на выполнение
ShutdownOS();
}
//Значит на выполнении нет задачи
gRunTask = gReadyTask.back();
gReadyTask.pop_back();
} else if ( (gRunTask.waitRes)||((gRunTask.priority < gReadyTask.back().priority)&&(!gReadyTask.back().waitRes)) ){
TTaskStruct task1 = gRunTask;
gRunTask = gReadyTask.back();
gReadyTask.pop_back();
gReadyTask.push_back(task1);
std::sort(gReadyTask.begin(),gReadyTask.end(),&compare);
}
//
//
*gE = *gRunTask.env;
if (gRunTask.jmp)
longjmp(gE,-1);
gRunTask.entry();
} |
|
Пишу ОС реального времени, это диспетчер, при переключении между задачами использую setjmp и longjmp. Запускаю первую задачу она захватывает ресурс1, позжу запускает вторую, вторая по приоритету выше выкидывает первую, но ей тоже нужен ресурс1, она идет в ожидание, первая заканчивает работу и освобождает ресурс1, тут должна включиться вторая, но на строчке longjmp вылетает прерывание из заголовка. Если убрать *gE = *gRunTask.env; и *gRunTask.env = *gE; использую gRunTask.env на прямую, совершенно на том же шаге выкидывает:
Необработанное исключение в "0x77a8e1b9" в "RTOS.exe": 0xC0000029: Неверный конечный адрес во время операции завершения.
при этом указывает на кусок кода их <algorithm>, использую visual studio 2008, спасибо.