Add configUSE_CORE_AFFINITY bits check (#776)

* Add core affinity bits check
* Add taskBITS_PER_BYTES
diff --git a/include/FreeRTOS.h b/include/FreeRTOS.h
index 1a6468b..980c9d0 100644
--- a/include/FreeRTOS.h
+++ b/include/FreeRTOS.h
@@ -1165,6 +1165,10 @@
     #error configUSE_TASK_PREEMPTION_DISABLE is not supported in single core FreeRTOS
 #endif
 
+#if ( ( configNUMBER_OF_CORES == 1 ) && ( configUSE_CORE_AFFINITY != 0 ) )
+    #error configUSE_CORE_AFFINITY is not supported in single core FreeRTOS
+#endif
+
 #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_PORT_OPTIMISED_TASK_SELECTION != 0 ) )
     #error configUSE_PORT_OPTIMISED_TASK_SELECTION is not supported in SMP FreeRTOS
 #endif
diff --git a/tasks.c b/tasks.c
index 1efb0d3..6b1c7a6 100644
--- a/tasks.c
+++ b/tasks.c
@@ -288,6 +288,8 @@
     #define INFINITE_LOOP()    1
 #endif
 
+#define taskBITS_PER_BYTE    ( ( size_t ) 8 )
+
 /*
  * Task control block.  A task control block (TCB) is allocated for each task,
  * and stores task state information, including a pointer to the task's context
@@ -302,7 +304,7 @@
     #endif
 
     #if ( configUSE_CORE_AFFINITY == 1 ) && ( configNUMBER_OF_CORES > 1 )
-        UBaseType_t uxCoreAffinityMask; /*< Used to link the task to certain cores.  UBaseType_t must have greater than or equal to the number of bits as confNUM_CORES. */
+        UBaseType_t uxCoreAffinityMask; /**< Used to link the task to certain cores.  UBaseType_t must have greater than or equal to the number of bits as configNUMBER_OF_CORES. */
     #endif
 
     ListItem_t xStateListItem;                  /**< The list that the state list item of a task is reference from denotes the state of that task (Ready, Blocked, Suspended ). */
@@ -3249,6 +3251,14 @@
 {
     BaseType_t xReturn;
 
+    #if ( configUSE_CORE_AFFINITY == 1 ) && ( configNUMBER_OF_CORES > 1 )
+    {
+        /* Sanity check that the UBaseType_t must have greater than or equal to
+         * the number of bits as confNUMBER_OF_CORES. */
+        configASSERT( ( sizeof( UBaseType_t ) * taskBITS_PER_BYTE ) >= configNUMBER_OF_CORES );
+    }
+    #endif /* #if ( configUSE_CORE_AFFINITY == 1 ) && ( configNUMBER_OF_CORES > 1 ) */
+
     xReturn = prvCreateIdleTasks();
 
     #if ( configUSE_TIMERS == 1 )