2016-03-25 6 views
1

RTP'ler arasında her şeyin iletişim içinde olduğunu anlatayım ama memPartFree hatası alıyorum! Burada BaşlarkenÖnceliksiz hata vxWorks

#include <iostream> 
#include <taskLib.h> 
#include <cstdlib> 
#include <vector> 
#include <msgQLib.h> 
using namespace std; 

#define TEN_BYTES 10 
#define HUNDERED_BYTES 100 
#define THOUSAND_BYTES 1000 
#define SIZE_OF_EACH_MESSAGE 10 
#define ONE_MESSAGE 1 
#define TEN_MESSAGE 10 
#define HUNDERED_MESSAGE 100 
#define WAIT_FOR_EVER -1 

void sender(); 
void receiver(); 
struct test 
{ 
    short int num1; 
    short int num2; 
    short int num3; 
    short int num4; 
    short int num5; 
}; 
MSG_Q_ID MsgQ_ID; 

int main() 
{ 
    cout<<__FUNCTION__<<endl; 

    MsgQ_ID = msgQCreate(ONE_MESSAGE,SIZE_OF_EACH_MESSAGE,MSG_Q_FIFO); 

    taskSpawn("receiver",150,VX_FP_TASK,10000,FUNCPTR (receiver),0,0,0,0,0,0,0,0,0,0); 
    taskSpawn("sender",150,VX_FP_TASK,10000,FUNCPTR (sender),0,0,0,0,0,0,0,0,0,0); 

    cout<<"wait here"<<endl; 
} 

void sender() 
{ 
    cout<<__FUNCTION__<<endl; 
    vector<test> vec; 
    test Obj; 

    while((vec.size() * SIZE_OF_EACH_MESSAGE) != TEN_BYTES) 
    { 
     Obj.num1 = rand(); 
     Obj.num2 = rand(); 
     Obj.num3 = rand(); 
     Obj.num4 = rand(); 
     Obj.num5 = rand(); 
     vec.push_back(Obj); 
    } 

    cout<<"Size of vector to be sent "<<vec.size()<<endl; 

    vector<test>::iterator it; 

    for(it = vec.begin();it!=vec.end();it++) 
    { 
     cout<<"Send Data:"<<endl; 
     cout<<it->num1<<"\t"<<it->num2<<"\t"<<it->num3<<"\t"<<it->num4<<"\t"<<it->num5<<endl; 
    } 

    int MsgQStatus = msgQSend(MsgQ_ID,(char*)&vec,(SIZE_OF_EACH_MESSAGE * ONE_MESSAGE),WAIT_FOR_EVER,MSG_PRI_NORMAL); 

    cout<<"Status of MsgQ Send:"<<MsgQStatus<<endl; 

} 

void receiver() 
{ 
    cout<<__FUNCTION__<<endl; 
    vector<test> vec; 

    vec.reserve(ONE_MESSAGE);// to initialize the vector otherwise it's size will become random 

    int MsgQStatus = msgQReceive(MsgQ_ID,(char*)&vec,(SIZE_OF_EACH_MESSAGE * ONE_MESSAGE),WAIT_FOR_EVER); 

    cout<<"Status of MsgQ Receive:"<<MsgQStatus<<endl; 

    vector<test>::iterator it; 
    cout<<"size of the received vector"<<vec.size()<<endl; 

     for(it = vec.begin();it!=vec.end();it++) 
     { 
      cout<<"Received data:"<<endl; 
      cout<<it->num1<<"\t"<<it->num2<<"\t"<<it->num3<<"\t"<<it->num4<<"\t"<<it->num5<<endl; 
     } 

} 

ve

çıktısı:

main 
receiver 
sender 
Size of vector to be sent 1 
Send Data: 
7403 -19371 19159 -10975 -24349 
Status of MsgQ Send:0 
Status of MsgQ Receive:10 
size of the received vector1 
Received data: 
7403 -19371 19159 -10975 -24349 
memPartFree: invalid block 0xff873850 in partition 0xff8593a0 

i memPartFree hatası alıyorum ve buna bağlı benim RTP durduruldu oluyor neden hiçbir fikrim yok !! YARDIM ET!!

cevap

0

Benim tahminim olduğunu size vector sınıfın iç elemanların gönderiyor vector<test> vec 10 bayt gönderiyor beri. Eğer ben yerine vektör ilk elemana bir iç işaretçisi yolluyoruz varsayalım senin struct test yolluyoruz gibi görünüyor olsa da

. Göndericiniz mesajın başarılı bir şekilde gönderilmesinden sonra mesajın alınmasından sonra alıcının serbest bırakılmış belleği boşaltmaya başlamasından sonra belleği serbest bırakır (hem gönderici hem de alıcı aynı bellekte çalışır).

Bu

fonksiyon çıkmadan önce gönderen veya alıcı görevi ya sonunda bir while (1) taskDelay(1); uygulanması ile test edilebilir. Bu, bir tanesini hafızayı boşaltmayı engeller. Daha sonra, memPartFree hatası doğruysa (memroy iki kez serbest bırakılmadığından) görünmüyor olmalıdır. İleride yapı değişikliklerinin boyutu ...
  • iletiye her bir elemanın struct test verilerini koyun eğer sorun önlemek için #define SIZE_OF_EACH_MESSAGE 10#define SIZE_OF_EACH_MESSAGE sizeof(struct test) için

    1. Değişikliği:

      bu aşağıdakileri yapın çözmek için &vec (örn. &(vec[0])) adresinden başlayan 10 baytlık sıra yerine msgQSend aramanız şu gibi görünmelidir: int MsgQStatus = msgQSend(MsgQ_ID, (char*)&(vec[0]),(SIZE_OF_EACH_MESSAGE * ONE_MESSAGE), WAIT_FOR_EVER, MSG_PRI_NORMAL);.
    2. geçici struct test Obj; değişken int MsgQStatus = msgQReceive(MsgQ_ID, (char*)&Obj, (SIZE_OF_EACH_MESSAGE * ONE_MESSAGE), WAIT_FOR_EVER); kullanarak veri alma.
    3. Verileri başarıyla aldıktan sonra, alıcı vektörünüzün sonuna (vec.push_back(Obj);) gönderin.