Compare commits
4 Commits
master
...
wersja_zda
Author | SHA1 | Date | |
---|---|---|---|
bf944507f3 | |||
441ff11999 | |||
061a7e669e | |||
3cd8e3e834 |
@ -286,3 +286,24 @@ int main(void)
|
||||
//{
|
||||
// for(;;);// user code here
|
||||
//}
|
||||
<<<<<<< HEAD
|
||||
|
||||
// komentarz zdalna edycja 5
|
||||
//ISR(BADISR_vect)
|
||||
//{
|
||||
// for(;;);// user code here
|
||||
//}
|
||||
|
||||
// komentarz zdalna edycja 6 po galezi
|
||||
//ISR(BADISR_vect)
|
||||
//{
|
||||
// for(;;);// user code here
|
||||
//}
|
||||
|
||||
// komentarz zdalna edycja 7 po galezi zdalnej 2
|
||||
//ISR(BADISR_vect)
|
||||
//{
|
||||
// for(;;);// user code here
|
||||
//}
|
||||
=======
|
||||
>>>>>>> 271502b08d2c496d81b2476277453e44ad52af4b
|
||||
|
309
projekt_wyklad_6_freertos/main_BACKUP_923.c
Normal file
309
projekt_wyklad_6_freertos/main_BACKUP_923.c
Normal file
@ -0,0 +1,309 @@
|
||||
/*
|
||||
* projekt_wyklad_3.c
|
||||
*
|
||||
* Created: 2020-10-10 09:45:33
|
||||
* Author : Zbyszek
|
||||
*/
|
||||
|
||||
|
||||
#include "sam.h"
|
||||
#include "FreeRTOS.h"
|
||||
#include "task.h"
|
||||
#include "queue.h"
|
||||
|
||||
unsigned long int ci=0, cp=0, ct=0, placebo=0;
|
||||
char h1=0, h2=0;
|
||||
TaskHandle_t xHandle1 = NULL, xHandle2 = NULL;
|
||||
QueueHandle_t xQueue;
|
||||
//TimerHandle_t xTimers[2/* NUM_TIMERS */];
|
||||
|
||||
/* Define an enumerated type used to identify the source of the data. */
|
||||
typedef enum
|
||||
{
|
||||
eSender1,
|
||||
eSender2
|
||||
} DataSource_t;
|
||||
/* Define the structure type that will be passed on the queue. */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t ucValue;
|
||||
DataSource_t eDataSource;
|
||||
} Data_t;
|
||||
/* Declare two variables of type Data_t that will be passed on the queue. */
|
||||
static const Data_t xStructsToSend[ 2 ] =
|
||||
{
|
||||
{ 100, eSender1 }, /* Used by Sender1. */
|
||||
{ 200, eSender2 } /* Used by Sender2. */
|
||||
};
|
||||
|
||||
void vApplicationIdleHook( void )
|
||||
{
|
||||
ci++;
|
||||
}
|
||||
|
||||
void vApplicationTickHook( void )
|
||||
{
|
||||
long fh= xPortGetFreeHeapSize();
|
||||
//uxTaskGetStackHighWaterMark(&xHandle1);
|
||||
//uxTaskGetStackHighWaterMark(&xHandle2);
|
||||
ct++;
|
||||
}
|
||||
|
||||
|
||||
void vApplicationStackOverflowHook( TaskHandle_t xTask, char *pcTaskName )
|
||||
{
|
||||
for(;;);
|
||||
}
|
||||
|
||||
void vApplicationMallocFailedHook( void )
|
||||
{
|
||||
for(;;);
|
||||
}
|
||||
|
||||
void vApplicationDaemonTaskStartupHook( void )
|
||||
{
|
||||
ci=0;
|
||||
cp=0;
|
||||
ct=0;
|
||||
}
|
||||
|
||||
|
||||
void vTaskCode1( void * pvParameters )
|
||||
{
|
||||
unsigned char p = 1; //(unsigned char) pvParameters;
|
||||
h1=1;
|
||||
|
||||
// configASSERT( ( ( uint32_t ) pvParameters ) == 1 );
|
||||
|
||||
//PORTB=(1<<PB5) | PORTB;
|
||||
|
||||
for( ;; )
|
||||
{
|
||||
if(p==1)
|
||||
{
|
||||
//DDRA = 0xff;
|
||||
//PORTA = 0xff;
|
||||
}
|
||||
else
|
||||
{
|
||||
//DDRC = 0xff;
|
||||
//PORTC = 0xff;
|
||||
}
|
||||
|
||||
vTaskDelay(10/ portTICK_PERIOD_MS);
|
||||
//taskYIELD();
|
||||
}
|
||||
}
|
||||
|
||||
void vTaskCode2( void * pvParameters )
|
||||
{
|
||||
unsigned char p = 2; // (unsigned char) pvParameters;
|
||||
h2=1;
|
||||
// configASSERT( ( ( uint32_t ) pvParameters ) == 1 );
|
||||
|
||||
// PORTB=(1<<PB5) | PORTB;
|
||||
|
||||
for( ;; )
|
||||
{
|
||||
if(p==1)
|
||||
{
|
||||
//DDRA = 0xff;
|
||||
//PORTA = 0xff;
|
||||
}
|
||||
else
|
||||
{
|
||||
//DDRC = 0xff;
|
||||
//PORTC = 0xff;
|
||||
}
|
||||
|
||||
vTaskDelay(10/ portTICK_PERIOD_MS);
|
||||
//taskYIELD();
|
||||
}
|
||||
}
|
||||
|
||||
int32_t lExpireCounters[ 2/*NUM_TIMERS*/ ] = { 0 };
|
||||
//void vTimerCallback( TimerHandle_t pxTimer )
|
||||
//{
|
||||
//int32_t lArrayIndex;
|
||||
//const int32_t xMaxExpiryCountBeforeStopping = 10;
|
||||
//
|
||||
//// Optionally do something if the pxTimer parameter is NULL.
|
||||
//configASSERT( pxTimer );
|
||||
//
|
||||
//// Which timer expired?
|
||||
//lArrayIndex = ( int32_t ) pvTimerGetTimerID( pxTimer );
|
||||
//
|
||||
//// Increment the number of times that pxTimer has expired.
|
||||
//lExpireCounters[ lArrayIndex ] += 1;
|
||||
//
|
||||
//// If the timer has expired 10 times then stop it from running.
|
||||
//if( lExpireCounters[ lArrayIndex ] == xMaxExpiryCountBeforeStopping )
|
||||
//{
|
||||
//// Do not use a block time if calling a timer API function from a
|
||||
//// timer callback function, as doing so could cause a deadlock!
|
||||
//xTimerStop( pxTimer, 0 );
|
||||
//}
|
||||
//}
|
||||
|
||||
static void vSenderTask( void *pvParameters )
|
||||
{
|
||||
BaseType_t xStatus;
|
||||
const TickType_t xTicksToWait = pdMS_TO_TICKS( 100 );
|
||||
for( ;; )
|
||||
{
|
||||
xStatus = xQueueSendToBack( xQueue, pvParameters, xTicksToWait );
|
||||
if( xStatus != pdPASS )
|
||||
{
|
||||
placebo++;
|
||||
//vPrintString( "Could not send to the queue.\r\n" );
|
||||
}
|
||||
taskYIELD();
|
||||
}
|
||||
}
|
||||
|
||||
static void vReceiverTask( void *pvParameters )
|
||||
{
|
||||
Data_t xReceivedStructure;
|
||||
BaseType_t xStatus;
|
||||
for( ;; )
|
||||
{
|
||||
if( uxQueueMessagesWaiting( xQueue ) != 3 )
|
||||
{
|
||||
placebo++;
|
||||
//vPrintString( "Queue should have been full!\r\n" );
|
||||
}
|
||||
xStatus = xQueueReceive( xQueue, &xReceivedStructure, 0 );
|
||||
if( xStatus == pdPASS )
|
||||
{
|
||||
if( xReceivedStructure.eDataSource == eSender1 )
|
||||
{
|
||||
placebo++;
|
||||
//vPrintStringAndNumber( "From Sender 1 = ", xReceivedStructure.ucValue );
|
||||
}
|
||||
else
|
||||
{
|
||||
placebo++;
|
||||
//vPrintStringAndNumber( "From Sender 2 = ", xReceivedStructure.ucValue );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
placebo++;
|
||||
//vPrintString( "Could not receive from the queue.\r\n" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
BaseType_t xReturned1, xReturned2;
|
||||
//static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
|
||||
//cli();
|
||||
//OCR1B=0xffff;
|
||||
//OCR1C=0xffff;
|
||||
// TIMSK0=0x01;
|
||||
// TCCR0A=0;
|
||||
// TCCR0B=0x05;
|
||||
|
||||
//DDRB = 0xff;
|
||||
//PORTB=~(1<<PB5) | PORTB;
|
||||
//PORTB=(1<<PB5) | PORTB;
|
||||
|
||||
//for(int x = 0; x < 2/*NUM_TIMERS*/; x++ )
|
||||
//{
|
||||
//xTimers[ x ] = xTimerCreate( "Timer", // Just a text name, not used by the kernel.
|
||||
//( 100 * x ), // The timer period in ticks.
|
||||
//pdTRUE, // The timers will auto-reload themselves when they expire.
|
||||
//( void * ) x, // Assign each timer a unique id equal to its array index.
|
||||
//vTimerCallback // Each timer calls the same callback when it expires.
|
||||
//);
|
||||
//
|
||||
//if( xTimers[ x ] == NULL )
|
||||
//{
|
||||
//// The timer was not created.
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
//// Start the timer. No block time is specified, and even if one was
|
||||
//// it would be ignored because the scheduler has not yet been
|
||||
//// started.
|
||||
//if( xTimerStart( xTimers[ x ], 0 ) != pdPASS )
|
||||
//{
|
||||
//// The timer could not be set into the Active state.
|
||||
//}
|
||||
//}
|
||||
//}
|
||||
|
||||
xQueue = xQueueCreate( 3, sizeof( Data_t ) );
|
||||
if( xQueue != NULL )
|
||||
{
|
||||
xTaskCreate( vSenderTask, "Sender1", 1000, &( xStructsToSend[ 0 ] ), 2, NULL );
|
||||
xTaskCreate( vSenderTask, "Sender2", 1000, &( xStructsToSend[ 1 ] ), 2, NULL );
|
||||
|
||||
xTaskCreate( vReceiverTask, "Receiver", 1000, NULL, 1, NULL );
|
||||
}
|
||||
|
||||
// xReturned1 = xTaskCreate(vTaskCode1, "A", 1*200, NULL/*( void * ) 1*/, 2, &xHandle1); //tskIDLE_PRIORITY
|
||||
// xReturned2 = xTaskCreate(vTaskCode2, "B", 1*200, NULL/*( void * ) 2*/, 2, &xHandle2); //tskIDLE_PRIORITY
|
||||
/* if(( xReturned1 != pdPASS ) || ( xReturned2 != pdPASS ))
|
||||
//if( xReturned1 != pdPASS )
|
||||
{
|
||||
vTaskDelete( xHandle1 );
|
||||
vTaskDelete( xHandle2 );
|
||||
for(;;);
|
||||
}*/
|
||||
size_t h = xPortGetFreeHeapSize();
|
||||
|
||||
vTaskStartScheduler();
|
||||
|
||||
while (1)
|
||||
{
|
||||
cp++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//ISR(BADISR_vect)
|
||||
//{
|
||||
// for(;;);// user code here
|
||||
//}
|
||||
|
||||
// komentarz
|
||||
|
||||
//ISR(BADISR_vect)
|
||||
//{
|
||||
// for(;;);// user code here
|
||||
//}
|
||||
|
||||
// komentarz 2
|
||||
//ISR(BADISR_vect)
|
||||
//{
|
||||
// for(;;);// user code here
|
||||
//}
|
||||
|
||||
// komentarz 3 i 4
|
||||
//ISR(BADISR_vect)
|
||||
//{
|
||||
// for(;;);// user code here
|
||||
//}
|
||||
<<<<<<< HEAD
|
||||
|
||||
// komentarz zdalna edycja 5
|
||||
//ISR(BADISR_vect)
|
||||
//{
|
||||
// for(;;);// user code here
|
||||
//}
|
||||
|
||||
// komentarz zdalna edycja 6 po galezi
|
||||
//ISR(BADISR_vect)
|
||||
//{
|
||||
// for(;;);// user code here
|
||||
//}
|
||||
|
||||
// komentarz zdalna edycja 7 po galezi zdalnej 2
|
||||
//ISR(BADISR_vect)
|
||||
//{
|
||||
// for(;;);// user code here
|
||||
//}
|
||||
=======
|
||||
>>>>>>> 271502b08d2c496d81b2476277453e44ad52af4b
|
282
projekt_wyklad_6_freertos/main_BASE_923.c
Normal file
282
projekt_wyklad_6_freertos/main_BASE_923.c
Normal file
@ -0,0 +1,282 @@
|
||||
/*
|
||||
* projekt_wyklad_3.c
|
||||
*
|
||||
* Created: 2020-10-10 09:45:33
|
||||
* Author : Zbyszek
|
||||
*/
|
||||
|
||||
|
||||
#include "sam.h"
|
||||
#include "FreeRTOS.h"
|
||||
#include "task.h"
|
||||
#include "queue.h"
|
||||
|
||||
unsigned long int ci=0, cp=0, ct=0, placebo=0;
|
||||
char h1=0, h2=0;
|
||||
TaskHandle_t xHandle1 = NULL, xHandle2 = NULL;
|
||||
QueueHandle_t xQueue;
|
||||
//TimerHandle_t xTimers[2/* NUM_TIMERS */];
|
||||
|
||||
/* Define an enumerated type used to identify the source of the data. */
|
||||
typedef enum
|
||||
{
|
||||
eSender1,
|
||||
eSender2
|
||||
} DataSource_t;
|
||||
/* Define the structure type that will be passed on the queue. */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t ucValue;
|
||||
DataSource_t eDataSource;
|
||||
} Data_t;
|
||||
/* Declare two variables of type Data_t that will be passed on the queue. */
|
||||
static const Data_t xStructsToSend[ 2 ] =
|
||||
{
|
||||
{ 100, eSender1 }, /* Used by Sender1. */
|
||||
{ 200, eSender2 } /* Used by Sender2. */
|
||||
};
|
||||
|
||||
void vApplicationIdleHook( void )
|
||||
{
|
||||
ci++;
|
||||
}
|
||||
|
||||
void vApplicationTickHook( void )
|
||||
{
|
||||
long fh= xPortGetFreeHeapSize();
|
||||
//uxTaskGetStackHighWaterMark(&xHandle1);
|
||||
//uxTaskGetStackHighWaterMark(&xHandle2);
|
||||
ct++;
|
||||
}
|
||||
|
||||
|
||||
void vApplicationStackOverflowHook( TaskHandle_t xTask, char *pcTaskName )
|
||||
{
|
||||
for(;;);
|
||||
}
|
||||
|
||||
void vApplicationMallocFailedHook( void )
|
||||
{
|
||||
for(;;);
|
||||
}
|
||||
|
||||
void vApplicationDaemonTaskStartupHook( void )
|
||||
{
|
||||
ci=0;
|
||||
cp=0;
|
||||
ct=0;
|
||||
}
|
||||
|
||||
|
||||
void vTaskCode1( void * pvParameters )
|
||||
{
|
||||
unsigned char p = 1; //(unsigned char) pvParameters;
|
||||
h1=1;
|
||||
|
||||
// configASSERT( ( ( uint32_t ) pvParameters ) == 1 );
|
||||
|
||||
//PORTB=(1<<PB5) | PORTB;
|
||||
|
||||
for( ;; )
|
||||
{
|
||||
if(p==1)
|
||||
{
|
||||
//DDRA = 0xff;
|
||||
//PORTA = 0xff;
|
||||
}
|
||||
else
|
||||
{
|
||||
//DDRC = 0xff;
|
||||
//PORTC = 0xff;
|
||||
}
|
||||
|
||||
vTaskDelay(10/ portTICK_PERIOD_MS);
|
||||
//taskYIELD();
|
||||
}
|
||||
}
|
||||
|
||||
void vTaskCode2( void * pvParameters )
|
||||
{
|
||||
unsigned char p = 2; // (unsigned char) pvParameters;
|
||||
h2=1;
|
||||
// configASSERT( ( ( uint32_t ) pvParameters ) == 1 );
|
||||
|
||||
// PORTB=(1<<PB5) | PORTB;
|
||||
|
||||
for( ;; )
|
||||
{
|
||||
if(p==1)
|
||||
{
|
||||
//DDRA = 0xff;
|
||||
//PORTA = 0xff;
|
||||
}
|
||||
else
|
||||
{
|
||||
//DDRC = 0xff;
|
||||
//PORTC = 0xff;
|
||||
}
|
||||
|
||||
vTaskDelay(10/ portTICK_PERIOD_MS);
|
||||
//taskYIELD();
|
||||
}
|
||||
}
|
||||
|
||||
int32_t lExpireCounters[ 2/*NUM_TIMERS*/ ] = { 0 };
|
||||
//void vTimerCallback( TimerHandle_t pxTimer )
|
||||
//{
|
||||
//int32_t lArrayIndex;
|
||||
//const int32_t xMaxExpiryCountBeforeStopping = 10;
|
||||
//
|
||||
//// Optionally do something if the pxTimer parameter is NULL.
|
||||
//configASSERT( pxTimer );
|
||||
//
|
||||
//// Which timer expired?
|
||||
//lArrayIndex = ( int32_t ) pvTimerGetTimerID( pxTimer );
|
||||
//
|
||||
//// Increment the number of times that pxTimer has expired.
|
||||
//lExpireCounters[ lArrayIndex ] += 1;
|
||||
//
|
||||
//// If the timer has expired 10 times then stop it from running.
|
||||
//if( lExpireCounters[ lArrayIndex ] == xMaxExpiryCountBeforeStopping )
|
||||
//{
|
||||
//// Do not use a block time if calling a timer API function from a
|
||||
//// timer callback function, as doing so could cause a deadlock!
|
||||
//xTimerStop( pxTimer, 0 );
|
||||
//}
|
||||
//}
|
||||
|
||||
static void vSenderTask( void *pvParameters )
|
||||
{
|
||||
BaseType_t xStatus;
|
||||
const TickType_t xTicksToWait = pdMS_TO_TICKS( 100 );
|
||||
for( ;; )
|
||||
{
|
||||
xStatus = xQueueSendToBack( xQueue, pvParameters, xTicksToWait );
|
||||
if( xStatus != pdPASS )
|
||||
{
|
||||
placebo++;
|
||||
//vPrintString( "Could not send to the queue.\r\n" );
|
||||
}
|
||||
taskYIELD();
|
||||
}
|
||||
}
|
||||
|
||||
static void vReceiverTask( void *pvParameters )
|
||||
{
|
||||
Data_t xReceivedStructure;
|
||||
BaseType_t xStatus;
|
||||
for( ;; )
|
||||
{
|
||||
if( uxQueueMessagesWaiting( xQueue ) != 3 )
|
||||
{
|
||||
placebo++;
|
||||
//vPrintString( "Queue should have been full!\r\n" );
|
||||
}
|
||||
xStatus = xQueueReceive( xQueue, &xReceivedStructure, 0 );
|
||||
if( xStatus == pdPASS )
|
||||
{
|
||||
if( xReceivedStructure.eDataSource == eSender1 )
|
||||
{
|
||||
placebo++;
|
||||
//vPrintStringAndNumber( "From Sender 1 = ", xReceivedStructure.ucValue );
|
||||
}
|
||||
else
|
||||
{
|
||||
placebo++;
|
||||
//vPrintStringAndNumber( "From Sender 2 = ", xReceivedStructure.ucValue );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
placebo++;
|
||||
//vPrintString( "Could not receive from the queue.\r\n" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
BaseType_t xReturned1, xReturned2;
|
||||
//static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
|
||||
//cli();
|
||||
//OCR1B=0xffff;
|
||||
//OCR1C=0xffff;
|
||||
// TIMSK0=0x01;
|
||||
// TCCR0A=0;
|
||||
// TCCR0B=0x05;
|
||||
|
||||
//DDRB = 0xff;
|
||||
//PORTB=~(1<<PB5) | PORTB;
|
||||
//PORTB=(1<<PB5) | PORTB;
|
||||
|
||||
//for(int x = 0; x < 2/*NUM_TIMERS*/; x++ )
|
||||
//{
|
||||
//xTimers[ x ] = xTimerCreate( "Timer", // Just a text name, not used by the kernel.
|
||||
//( 100 * x ), // The timer period in ticks.
|
||||
//pdTRUE, // The timers will auto-reload themselves when they expire.
|
||||
//( void * ) x, // Assign each timer a unique id equal to its array index.
|
||||
//vTimerCallback // Each timer calls the same callback when it expires.
|
||||
//);
|
||||
//
|
||||
//if( xTimers[ x ] == NULL )
|
||||
//{
|
||||
//// The timer was not created.
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
//// Start the timer. No block time is specified, and even if one was
|
||||
//// it would be ignored because the scheduler has not yet been
|
||||
//// started.
|
||||
//if( xTimerStart( xTimers[ x ], 0 ) != pdPASS )
|
||||
//{
|
||||
//// The timer could not be set into the Active state.
|
||||
//}
|
||||
//}
|
||||
//}
|
||||
|
||||
xQueue = xQueueCreate( 3, sizeof( Data_t ) );
|
||||
if( xQueue != NULL )
|
||||
{
|
||||
xTaskCreate( vSenderTask, "Sender1", 1000, &( xStructsToSend[ 0 ] ), 2, NULL );
|
||||
xTaskCreate( vSenderTask, "Sender2", 1000, &( xStructsToSend[ 1 ] ), 2, NULL );
|
||||
|
||||
xTaskCreate( vReceiverTask, "Receiver", 1000, NULL, 1, NULL );
|
||||
}
|
||||
|
||||
// xReturned1 = xTaskCreate(vTaskCode1, "A", 1*200, NULL/*( void * ) 1*/, 2, &xHandle1); //tskIDLE_PRIORITY
|
||||
// xReturned2 = xTaskCreate(vTaskCode2, "B", 1*200, NULL/*( void * ) 2*/, 2, &xHandle2); //tskIDLE_PRIORITY
|
||||
/* if(( xReturned1 != pdPASS ) || ( xReturned2 != pdPASS ))
|
||||
//if( xReturned1 != pdPASS )
|
||||
{
|
||||
vTaskDelete( xHandle1 );
|
||||
vTaskDelete( xHandle2 );
|
||||
for(;;);
|
||||
}*/
|
||||
size_t h = xPortGetFreeHeapSize();
|
||||
|
||||
vTaskStartScheduler();
|
||||
|
||||
while (1)
|
||||
{
|
||||
cp++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//ISR(BADISR_vect)
|
||||
//{
|
||||
// for(;;);// user code here
|
||||
//}
|
||||
|
||||
// komentarz
|
||||
|
||||
//ISR(BADISR_vect)
|
||||
//{
|
||||
// for(;;);// user code here
|
||||
//}
|
||||
|
||||
// komentarz 2
|
||||
//ISR(BADISR_vect)
|
||||
//{
|
||||
// for(;;);// user code here
|
||||
//}
|
306
projekt_wyklad_6_freertos/main_LOCAL_923.c
Normal file
306
projekt_wyklad_6_freertos/main_LOCAL_923.c
Normal file
@ -0,0 +1,306 @@
|
||||
/*
|
||||
* projekt_wyklad_3.c
|
||||
*
|
||||
* Created: 2020-10-10 09:45:33
|
||||
* Author : Zbyszek
|
||||
*/
|
||||
|
||||
|
||||
#include "sam.h"
|
||||
#include "FreeRTOS.h"
|
||||
#include "task.h"
|
||||
#include "queue.h"
|
||||
|
||||
unsigned long int ci=0, cp=0, ct=0, placebo=0;
|
||||
char h1=0, h2=0;
|
||||
TaskHandle_t xHandle1 = NULL, xHandle2 = NULL;
|
||||
QueueHandle_t xQueue;
|
||||
//TimerHandle_t xTimers[2/* NUM_TIMERS */];
|
||||
|
||||
/* Define an enumerated type used to identify the source of the data. */
|
||||
typedef enum
|
||||
{
|
||||
eSender1,
|
||||
eSender2
|
||||
} DataSource_t;
|
||||
/* Define the structure type that will be passed on the queue. */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t ucValue;
|
||||
DataSource_t eDataSource;
|
||||
} Data_t;
|
||||
/* Declare two variables of type Data_t that will be passed on the queue. */
|
||||
static const Data_t xStructsToSend[ 2 ] =
|
||||
{
|
||||
{ 100, eSender1 }, /* Used by Sender1. */
|
||||
{ 200, eSender2 } /* Used by Sender2. */
|
||||
};
|
||||
|
||||
void vApplicationIdleHook( void )
|
||||
{
|
||||
ci++;
|
||||
}
|
||||
|
||||
void vApplicationTickHook( void )
|
||||
{
|
||||
long fh= xPortGetFreeHeapSize();
|
||||
//uxTaskGetStackHighWaterMark(&xHandle1);
|
||||
//uxTaskGetStackHighWaterMark(&xHandle2);
|
||||
ct++;
|
||||
}
|
||||
|
||||
|
||||
void vApplicationStackOverflowHook( TaskHandle_t xTask, char *pcTaskName )
|
||||
{
|
||||
for(;;);
|
||||
}
|
||||
|
||||
void vApplicationMallocFailedHook( void )
|
||||
{
|
||||
for(;;);
|
||||
}
|
||||
|
||||
void vApplicationDaemonTaskStartupHook( void )
|
||||
{
|
||||
ci=0;
|
||||
cp=0;
|
||||
ct=0;
|
||||
}
|
||||
|
||||
|
||||
void vTaskCode1( void * pvParameters )
|
||||
{
|
||||
unsigned char p = 1; //(unsigned char) pvParameters;
|
||||
h1=1;
|
||||
|
||||
// configASSERT( ( ( uint32_t ) pvParameters ) == 1 );
|
||||
|
||||
//PORTB=(1<<PB5) | PORTB;
|
||||
|
||||
for( ;; )
|
||||
{
|
||||
if(p==1)
|
||||
{
|
||||
//DDRA = 0xff;
|
||||
//PORTA = 0xff;
|
||||
}
|
||||
else
|
||||
{
|
||||
//DDRC = 0xff;
|
||||
//PORTC = 0xff;
|
||||
}
|
||||
|
||||
vTaskDelay(10/ portTICK_PERIOD_MS);
|
||||
//taskYIELD();
|
||||
}
|
||||
}
|
||||
|
||||
void vTaskCode2( void * pvParameters )
|
||||
{
|
||||
unsigned char p = 2; // (unsigned char) pvParameters;
|
||||
h2=1;
|
||||
// configASSERT( ( ( uint32_t ) pvParameters ) == 1 );
|
||||
|
||||
// PORTB=(1<<PB5) | PORTB;
|
||||
|
||||
for( ;; )
|
||||
{
|
||||
if(p==1)
|
||||
{
|
||||
//DDRA = 0xff;
|
||||
//PORTA = 0xff;
|
||||
}
|
||||
else
|
||||
{
|
||||
//DDRC = 0xff;
|
||||
//PORTC = 0xff;
|
||||
}
|
||||
|
||||
vTaskDelay(10/ portTICK_PERIOD_MS);
|
||||
//taskYIELD();
|
||||
}
|
||||
}
|
||||
|
||||
int32_t lExpireCounters[ 2/*NUM_TIMERS*/ ] = { 0 };
|
||||
//void vTimerCallback( TimerHandle_t pxTimer )
|
||||
//{
|
||||
//int32_t lArrayIndex;
|
||||
//const int32_t xMaxExpiryCountBeforeStopping = 10;
|
||||
//
|
||||
//// Optionally do something if the pxTimer parameter is NULL.
|
||||
//configASSERT( pxTimer );
|
||||
//
|
||||
//// Which timer expired?
|
||||
//lArrayIndex = ( int32_t ) pvTimerGetTimerID( pxTimer );
|
||||
//
|
||||
//// Increment the number of times that pxTimer has expired.
|
||||
//lExpireCounters[ lArrayIndex ] += 1;
|
||||
//
|
||||
//// If the timer has expired 10 times then stop it from running.
|
||||
//if( lExpireCounters[ lArrayIndex ] == xMaxExpiryCountBeforeStopping )
|
||||
//{
|
||||
//// Do not use a block time if calling a timer API function from a
|
||||
//// timer callback function, as doing so could cause a deadlock!
|
||||
//xTimerStop( pxTimer, 0 );
|
||||
//}
|
||||
//}
|
||||
|
||||
static void vSenderTask( void *pvParameters )
|
||||
{
|
||||
BaseType_t xStatus;
|
||||
const TickType_t xTicksToWait = pdMS_TO_TICKS( 100 );
|
||||
for( ;; )
|
||||
{
|
||||
xStatus = xQueueSendToBack( xQueue, pvParameters, xTicksToWait );
|
||||
if( xStatus != pdPASS )
|
||||
{
|
||||
placebo++;
|
||||
//vPrintString( "Could not send to the queue.\r\n" );
|
||||
}
|
||||
taskYIELD();
|
||||
}
|
||||
}
|
||||
|
||||
static void vReceiverTask( void *pvParameters )
|
||||
{
|
||||
Data_t xReceivedStructure;
|
||||
BaseType_t xStatus;
|
||||
for( ;; )
|
||||
{
|
||||
if( uxQueueMessagesWaiting( xQueue ) != 3 )
|
||||
{
|
||||
placebo++;
|
||||
//vPrintString( "Queue should have been full!\r\n" );
|
||||
}
|
||||
xStatus = xQueueReceive( xQueue, &xReceivedStructure, 0 );
|
||||
if( xStatus == pdPASS )
|
||||
{
|
||||
if( xReceivedStructure.eDataSource == eSender1 )
|
||||
{
|
||||
placebo++;
|
||||
//vPrintStringAndNumber( "From Sender 1 = ", xReceivedStructure.ucValue );
|
||||
}
|
||||
else
|
||||
{
|
||||
placebo++;
|
||||
//vPrintStringAndNumber( "From Sender 2 = ", xReceivedStructure.ucValue );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
placebo++;
|
||||
//vPrintString( "Could not receive from the queue.\r\n" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
BaseType_t xReturned1, xReturned2;
|
||||
//static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
|
||||
//cli();
|
||||
//OCR1B=0xffff;
|
||||
//OCR1C=0xffff;
|
||||
// TIMSK0=0x01;
|
||||
// TCCR0A=0;
|
||||
// TCCR0B=0x05;
|
||||
|
||||
//DDRB = 0xff;
|
||||
//PORTB=~(1<<PB5) | PORTB;
|
||||
//PORTB=(1<<PB5) | PORTB;
|
||||
|
||||
//for(int x = 0; x < 2/*NUM_TIMERS*/; x++ )
|
||||
//{
|
||||
//xTimers[ x ] = xTimerCreate( "Timer", // Just a text name, not used by the kernel.
|
||||
//( 100 * x ), // The timer period in ticks.
|
||||
//pdTRUE, // The timers will auto-reload themselves when they expire.
|
||||
//( void * ) x, // Assign each timer a unique id equal to its array index.
|
||||
//vTimerCallback // Each timer calls the same callback when it expires.
|
||||
//);
|
||||
//
|
||||
//if( xTimers[ x ] == NULL )
|
||||
//{
|
||||
//// The timer was not created.
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
//// Start the timer. No block time is specified, and even if one was
|
||||
//// it would be ignored because the scheduler has not yet been
|
||||
//// started.
|
||||
//if( xTimerStart( xTimers[ x ], 0 ) != pdPASS )
|
||||
//{
|
||||
//// The timer could not be set into the Active state.
|
||||
//}
|
||||
//}
|
||||
//}
|
||||
|
||||
xQueue = xQueueCreate( 3, sizeof( Data_t ) );
|
||||
if( xQueue != NULL )
|
||||
{
|
||||
xTaskCreate( vSenderTask, "Sender1", 1000, &( xStructsToSend[ 0 ] ), 2, NULL );
|
||||
xTaskCreate( vSenderTask, "Sender2", 1000, &( xStructsToSend[ 1 ] ), 2, NULL );
|
||||
|
||||
xTaskCreate( vReceiverTask, "Receiver", 1000, NULL, 1, NULL );
|
||||
}
|
||||
|
||||
// xReturned1 = xTaskCreate(vTaskCode1, "A", 1*200, NULL/*( void * ) 1*/, 2, &xHandle1); //tskIDLE_PRIORITY
|
||||
// xReturned2 = xTaskCreate(vTaskCode2, "B", 1*200, NULL/*( void * ) 2*/, 2, &xHandle2); //tskIDLE_PRIORITY
|
||||
/* if(( xReturned1 != pdPASS ) || ( xReturned2 != pdPASS ))
|
||||
//if( xReturned1 != pdPASS )
|
||||
{
|
||||
vTaskDelete( xHandle1 );
|
||||
vTaskDelete( xHandle2 );
|
||||
for(;;);
|
||||
}*/
|
||||
size_t h = xPortGetFreeHeapSize();
|
||||
|
||||
vTaskStartScheduler();
|
||||
|
||||
while (1)
|
||||
{
|
||||
cp++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//ISR(BADISR_vect)
|
||||
//{
|
||||
// for(;;);// user code here
|
||||
//}
|
||||
|
||||
// komentarz
|
||||
|
||||
//ISR(BADISR_vect)
|
||||
//{
|
||||
// for(;;);// user code here
|
||||
//}
|
||||
|
||||
// komentarz 2
|
||||
//ISR(BADISR_vect)
|
||||
//{
|
||||
// for(;;);// user code here
|
||||
//}
|
||||
|
||||
// komentarz 3 i 4
|
||||
//ISR(BADISR_vect)
|
||||
//{
|
||||
// for(;;);// user code here
|
||||
//}
|
||||
|
||||
// komentarz zdalna edycja 5
|
||||
//ISR(BADISR_vect)
|
||||
//{
|
||||
// for(;;);// user code here
|
||||
//}
|
||||
|
||||
// komentarz zdalna edycja 6 po galezi
|
||||
//ISR(BADISR_vect)
|
||||
//{
|
||||
// for(;;);// user code here
|
||||
//}
|
||||
|
||||
// komentarz zdalna edycja 7 po galezi zdalnej 2
|
||||
//ISR(BADISR_vect)
|
||||
//{
|
||||
// for(;;);// user code here
|
||||
//}
|
288
projekt_wyklad_6_freertos/main_REMOTE_923.c
Normal file
288
projekt_wyklad_6_freertos/main_REMOTE_923.c
Normal file
@ -0,0 +1,288 @@
|
||||
/*
|
||||
* projekt_wyklad_3.c
|
||||
*
|
||||
* Created: 2020-10-10 09:45:33
|
||||
* Author : Zbyszek
|
||||
*/
|
||||
|
||||
|
||||
#include "sam.h"
|
||||
#include "FreeRTOS.h"
|
||||
#include "task.h"
|
||||
#include "queue.h"
|
||||
|
||||
unsigned long int ci=0, cp=0, ct=0, placebo=0;
|
||||
char h1=0, h2=0;
|
||||
TaskHandle_t xHandle1 = NULL, xHandle2 = NULL;
|
||||
QueueHandle_t xQueue;
|
||||
//TimerHandle_t xTimers[2/* NUM_TIMERS */];
|
||||
|
||||
/* Define an enumerated type used to identify the source of the data. */
|
||||
typedef enum
|
||||
{
|
||||
eSender1,
|
||||
eSender2
|
||||
} DataSource_t;
|
||||
/* Define the structure type that will be passed on the queue. */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t ucValue;
|
||||
DataSource_t eDataSource;
|
||||
} Data_t;
|
||||
/* Declare two variables of type Data_t that will be passed on the queue. */
|
||||
static const Data_t xStructsToSend[ 2 ] =
|
||||
{
|
||||
{ 100, eSender1 }, /* Used by Sender1. */
|
||||
{ 200, eSender2 } /* Used by Sender2. */
|
||||
};
|
||||
|
||||
void vApplicationIdleHook( void )
|
||||
{
|
||||
ci++;
|
||||
}
|
||||
|
||||
void vApplicationTickHook( void )
|
||||
{
|
||||
long fh= xPortGetFreeHeapSize();
|
||||
//uxTaskGetStackHighWaterMark(&xHandle1);
|
||||
//uxTaskGetStackHighWaterMark(&xHandle2);
|
||||
ct++;
|
||||
}
|
||||
|
||||
|
||||
void vApplicationStackOverflowHook( TaskHandle_t xTask, char *pcTaskName )
|
||||
{
|
||||
for(;;);
|
||||
}
|
||||
|
||||
void vApplicationMallocFailedHook( void )
|
||||
{
|
||||
for(;;);
|
||||
}
|
||||
|
||||
void vApplicationDaemonTaskStartupHook( void )
|
||||
{
|
||||
ci=0;
|
||||
cp=0;
|
||||
ct=0;
|
||||
}
|
||||
|
||||
|
||||
void vTaskCode1( void * pvParameters )
|
||||
{
|
||||
unsigned char p = 1; //(unsigned char) pvParameters;
|
||||
h1=1;
|
||||
|
||||
// configASSERT( ( ( uint32_t ) pvParameters ) == 1 );
|
||||
|
||||
//PORTB=(1<<PB5) | PORTB;
|
||||
|
||||
for( ;; )
|
||||
{
|
||||
if(p==1)
|
||||
{
|
||||
//DDRA = 0xff;
|
||||
//PORTA = 0xff;
|
||||
}
|
||||
else
|
||||
{
|
||||
//DDRC = 0xff;
|
||||
//PORTC = 0xff;
|
||||
}
|
||||
|
||||
vTaskDelay(10/ portTICK_PERIOD_MS);
|
||||
//taskYIELD();
|
||||
}
|
||||
}
|
||||
|
||||
void vTaskCode2( void * pvParameters )
|
||||
{
|
||||
unsigned char p = 2; // (unsigned char) pvParameters;
|
||||
h2=1;
|
||||
// configASSERT( ( ( uint32_t ) pvParameters ) == 1 );
|
||||
|
||||
// PORTB=(1<<PB5) | PORTB;
|
||||
|
||||
for( ;; )
|
||||
{
|
||||
if(p==1)
|
||||
{
|
||||
//DDRA = 0xff;
|
||||
//PORTA = 0xff;
|
||||
}
|
||||
else
|
||||
{
|
||||
//DDRC = 0xff;
|
||||
//PORTC = 0xff;
|
||||
}
|
||||
|
||||
vTaskDelay(10/ portTICK_PERIOD_MS);
|
||||
//taskYIELD();
|
||||
}
|
||||
}
|
||||
|
||||
int32_t lExpireCounters[ 2/*NUM_TIMERS*/ ] = { 0 };
|
||||
//void vTimerCallback( TimerHandle_t pxTimer )
|
||||
//{
|
||||
//int32_t lArrayIndex;
|
||||
//const int32_t xMaxExpiryCountBeforeStopping = 10;
|
||||
//
|
||||
//// Optionally do something if the pxTimer parameter is NULL.
|
||||
//configASSERT( pxTimer );
|
||||
//
|
||||
//// Which timer expired?
|
||||
//lArrayIndex = ( int32_t ) pvTimerGetTimerID( pxTimer );
|
||||
//
|
||||
//// Increment the number of times that pxTimer has expired.
|
||||
//lExpireCounters[ lArrayIndex ] += 1;
|
||||
//
|
||||
//// If the timer has expired 10 times then stop it from running.
|
||||
//if( lExpireCounters[ lArrayIndex ] == xMaxExpiryCountBeforeStopping )
|
||||
//{
|
||||
//// Do not use a block time if calling a timer API function from a
|
||||
//// timer callback function, as doing so could cause a deadlock!
|
||||
//xTimerStop( pxTimer, 0 );
|
||||
//}
|
||||
//}
|
||||
|
||||
static void vSenderTask( void *pvParameters )
|
||||
{
|
||||
BaseType_t xStatus;
|
||||
const TickType_t xTicksToWait = pdMS_TO_TICKS( 100 );
|
||||
for( ;; )
|
||||
{
|
||||
xStatus = xQueueSendToBack( xQueue, pvParameters, xTicksToWait );
|
||||
if( xStatus != pdPASS )
|
||||
{
|
||||
placebo++;
|
||||
//vPrintString( "Could not send to the queue.\r\n" );
|
||||
}
|
||||
taskYIELD();
|
||||
}
|
||||
}
|
||||
|
||||
static void vReceiverTask( void *pvParameters )
|
||||
{
|
||||
Data_t xReceivedStructure;
|
||||
BaseType_t xStatus;
|
||||
for( ;; )
|
||||
{
|
||||
if( uxQueueMessagesWaiting( xQueue ) != 3 )
|
||||
{
|
||||
placebo++;
|
||||
//vPrintString( "Queue should have been full!\r\n" );
|
||||
}
|
||||
xStatus = xQueueReceive( xQueue, &xReceivedStructure, 0 );
|
||||
if( xStatus == pdPASS )
|
||||
{
|
||||
if( xReceivedStructure.eDataSource == eSender1 )
|
||||
{
|
||||
placebo++;
|
||||
//vPrintStringAndNumber( "From Sender 1 = ", xReceivedStructure.ucValue );
|
||||
}
|
||||
else
|
||||
{
|
||||
placebo++;
|
||||
//vPrintStringAndNumber( "From Sender 2 = ", xReceivedStructure.ucValue );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
placebo++;
|
||||
//vPrintString( "Could not receive from the queue.\r\n" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
BaseType_t xReturned1, xReturned2;
|
||||
//static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
|
||||
//cli();
|
||||
//OCR1B=0xffff;
|
||||
//OCR1C=0xffff;
|
||||
// TIMSK0=0x01;
|
||||
// TCCR0A=0;
|
||||
// TCCR0B=0x05;
|
||||
|
||||
//DDRB = 0xff;
|
||||
//PORTB=~(1<<PB5) | PORTB;
|
||||
//PORTB=(1<<PB5) | PORTB;
|
||||
|
||||
//for(int x = 0; x < 2/*NUM_TIMERS*/; x++ )
|
||||
//{
|
||||
//xTimers[ x ] = xTimerCreate( "Timer", // Just a text name, not used by the kernel.
|
||||
//( 100 * x ), // The timer period in ticks.
|
||||
//pdTRUE, // The timers will auto-reload themselves when they expire.
|
||||
//( void * ) x, // Assign each timer a unique id equal to its array index.
|
||||
//vTimerCallback // Each timer calls the same callback when it expires.
|
||||
//);
|
||||
//
|
||||
//if( xTimers[ x ] == NULL )
|
||||
//{
|
||||
//// The timer was not created.
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
//// Start the timer. No block time is specified, and even if one was
|
||||
//// it would be ignored because the scheduler has not yet been
|
||||
//// started.
|
||||
//if( xTimerStart( xTimers[ x ], 0 ) != pdPASS )
|
||||
//{
|
||||
//// The timer could not be set into the Active state.
|
||||
//}
|
||||
//}
|
||||
//}
|
||||
|
||||
xQueue = xQueueCreate( 3, sizeof( Data_t ) );
|
||||
if( xQueue != NULL )
|
||||
{
|
||||
xTaskCreate( vSenderTask, "Sender1", 1000, &( xStructsToSend[ 0 ] ), 2, NULL );
|
||||
xTaskCreate( vSenderTask, "Sender2", 1000, &( xStructsToSend[ 1 ] ), 2, NULL );
|
||||
|
||||
xTaskCreate( vReceiverTask, "Receiver", 1000, NULL, 1, NULL );
|
||||
}
|
||||
|
||||
// xReturned1 = xTaskCreate(vTaskCode1, "A", 1*200, NULL/*( void * ) 1*/, 2, &xHandle1); //tskIDLE_PRIORITY
|
||||
// xReturned2 = xTaskCreate(vTaskCode2, "B", 1*200, NULL/*( void * ) 2*/, 2, &xHandle2); //tskIDLE_PRIORITY
|
||||
/* if(( xReturned1 != pdPASS ) || ( xReturned2 != pdPASS ))
|
||||
//if( xReturned1 != pdPASS )
|
||||
{
|
||||
vTaskDelete( xHandle1 );
|
||||
vTaskDelete( xHandle2 );
|
||||
for(;;);
|
||||
}*/
|
||||
size_t h = xPortGetFreeHeapSize();
|
||||
|
||||
vTaskStartScheduler();
|
||||
|
||||
while (1)
|
||||
{
|
||||
cp++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//ISR(BADISR_vect)
|
||||
//{
|
||||
// for(;;);// user code here
|
||||
//}
|
||||
|
||||
// komentarz
|
||||
|
||||
//ISR(BADISR_vect)
|
||||
//{
|
||||
// for(;;);// user code here
|
||||
//}
|
||||
|
||||
// komentarz 2
|
||||
//ISR(BADISR_vect)
|
||||
//{
|
||||
// for(;;);// user code here
|
||||
//}
|
||||
|
||||
// komentarz 3 i 4
|
||||
//ISR(BADISR_vect)
|
||||
//{
|
||||
// for(;;);// user code here
|
||||
//}
|
Loading…
Reference in New Issue
Block a user