سؤال

والبرمجة لبلدي اردوينو (في نوع من مزيج من C / C ++)، لاحظت شيء غريب.

وكل مرة اتصال عبر المنفذ التسلسلي، وإبقاء العين على استخدام SRAM. وعادة ما يتراوح بين 300 ~ 400 بايت. ومع ذلك، بعد إضافة روتين جديد (انظر أدناه)، لاحظت أنه قفز دائما من 300 ~ 400 بايت من الذاكرة الحرة ل<م> بالضبط 1023. اعتقادي هو أن هناك مشكلة.

وهذا هو روتين جديد

void NewRoutine(char *cmdd){

   GSM.print(cmdd);
   GSM.print(26, BYTE);
   GSM.print(endl); // <-- added later
   Serial.print(availableMemory());
}

وهذا هو الروتين MemoryCheck

  int availableMemory() {
  int size = 1024;
  byte *buf;
  while ((buf = (byte *) malloc(--size)) == NULL);
  free(buf);
  return size;
}

يرجى ملاحظة هذا: أولا، إلا أنها لا تعمل. بعد أن أضاف الأمر ENDL، لأنها عملت بطريقة سحرية، ولكن بعد ذلك لاحظت المشكلة الذاكرة.

وأي شخص حصل على أفكار لالحل؟

هل كانت مفيدة؟

المحلول

والسبب كنت الحصول على 1023 بايت من الذاكرة الحرة هو محض لأن malloc (في 1023 - وهو --1024) ينجح في المحاولة الأولى. هذا يعني أن لديك ما لا يقل عن 1023 بايت من الذاكرة - ولكن لا اقول لكم الذاكرة الحقيقية المتاحة

وقبل ذلك، يجب أن تكون قد كان شيء حفظ الذاكرة حولها. تخميني هو الطبقة GSM هنا - وربما يحمل البيانات (cmdd + 26) في المخزن المؤقت الداخلي الذي يتم مسح على السطر. بمجرد أضاف دعوة ENDL الخاص بك، وربما كنت الحصول على ذاكرة الظهير من المخزن المؤقت.

وكيف كبير هو الأمر الخاص بك؟ تخميني هو أنه (أو مجموعة كاملة منهم) هو على الارجح حوالي 700 بايت ...

نصائح أخرى

وربما يحمل عازلة على كومة لنقل البيانات إلى المنفذ التسلسلي؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top