Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: Autoflight2018_22_MODSERIAL
Fork of MODSERIAL by
Revision 38:a04506a9a55b, committed 2014-12-12
- Comitter:
- BlazeX
- Date:
- Fri Dec 12 08:49:27 2014 +0000
- Parent:
- 37:31db07ebcb68
- Child:
- 39:8ef4f91813fd
- Commit message:
- Fixed txBufferSetSize and rxBufferSetSize. Now working with buffers in use.
Changed in this revision
| MODSERIAL.h | Show annotated file Show diff for this revision Revisions of this file |
| RESIZE.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/MODSERIAL.h Thu Dec 11 20:24:15 2014 +0000
+++ b/MODSERIAL.h Fri Dec 12 08:49:27 2014 +0000
@@ -949,19 +949,7 @@
* @ingroup INTERNALS
*/
int resizeBuffer(int size, IrqType type = RxIrq, bool memory_check = true);
-
- /**
- * Function: downSizeBuffer
- * @ingroup INTERNALS
- */
- int downSizeBuffer(int size, IrqType type, bool memory_check);
-
- /**
- * Function: upSizeBuffer
- * @ingroup INTERNALS
- */
- int upSizeBuffer(int size, IrqType type, bool memory_check);
-
+
/**
* Function: moveRingBuffer
* @ingroup INTERNALS
@@ -1005,3 +993,4 @@
using namespace AjK;
#endif
+
--- a/RESIZE.cpp Thu Dec 11 20:24:15 2014 +0000
+++ b/RESIZE.cpp Fri Dec 12 08:49:27 2014 +0000
@@ -27,37 +27,24 @@
int
MODSERIAL::resizeBuffer(int size, IrqType type, bool memory_check)
-{
- int rval = Ok;
-
- // If the requested size is the same as the current size there's nothing to do,
- // just continue to use the same buffer as it's fine as it is.
- if (buffer_size[type] == size) return rval;
-
+{
// Make sure the ISR cannot use the buffers while we are manipulating them.
NVIC_DisableIRQ(_IRQ);
- // If the requested buffer size is larger than the current size,
- // attempt to create a new buffer and use it.
- if (buffer_size[type] < size) {
- rval = upSizeBuffer(size, type, memory_check);
- }
- else if (buffer_size[type] > size) {
- rval = downSizeBuffer(size, type, memory_check);
+ // If the requested size is the same as the current size there's nothing to do,
+ // just continue to use the same buffer as it's fine as it is.
+ if (buffer_size[type] == size)
+ {
+ NVIC_EnableIRQ(_IRQ);
+ return Ok;
}
- // Start the ISR system again with the new buffers.
- NVIC_EnableIRQ(_IRQ);
-
- return rval;
-}
-
-int
-MODSERIAL::downSizeBuffer(int size, IrqType type, bool memory_check)
-{
// is new buffer is big enough?
if (size <= buffer_count[type])
+ {
+ NVIC_EnableIRQ(_IRQ);
return BufferOversize;
+ }
// allocate new buffer
char * newBuffer = (char*)malloc(size);
@@ -80,46 +67,19 @@
buffer[type] = newBuffer;
buffer_size[type] = size;
buffer_in[type] = buffer_count[type];
- buffer_out[type] = 0;
-
- return Ok;
-}
-
-int
-MODSERIAL::upSizeBuffer(int size, IrqType type, bool memory_check)
-{
- // allocate new buffer
- char * newBuffer = (char*)malloc(size);
+ buffer_out[type] = 0;
- // allocation failed?
- if (newBuffer == (char*)NULL)
- {
- if (memory_check)
- error("Failed to allocate memory for %s buffer", type == TxIrq ? "TX" : "RX");
-
- return NoMemory;
- }
-
- // copy old buffer content to new one
- moveRingBuffer(newBuffer, type);
-
- // free old buffer and reset ring buffer cursor
- free((char*)buffer[type]);
-
- buffer[type] = newBuffer;
- buffer_size[type] = size;
- buffer_in[type] = buffer_count[type];
- buffer_out[type] = 0;
-
+ // Start the ISR system again with the new buffers.
+ NVIC_EnableIRQ(_IRQ);
return Ok;
}
void MODSERIAL::moveRingBuffer(char * newBuffer, IrqType type)
-{
+{
// copy old buffer content to new one
if(buffer_in[type] > buffer_out[type])
{ // content in the middle of the ring buffer
- memcpy(&newBuffer[0], (char*)buffer[type], buffer_count[type]);
+ memcpy(&newBuffer[0], (char*)&buffer[type][buffer_out[type]], buffer_count[type]);
}
else if(buffer_in[type] < buffer_out[type])
{ // content split, free space in the middle
