1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | // (c) 2019, Lutfi Shihab #include <iostream> #include <vector> // todo template <typename T> class Matrix { public: Matrix(int rows, int cols) : m_rows(rows), m_cols(cols) {} private: int m_rows; int m_cols; }; /* function that returns nth Fibonacci number */ template <typename T> class Fibonacci { public: Fibonacci(T n) { m_fibNum = fib(n); } operator T() const { return m_fibNum; } operator int() const { return m_fibNum; } friend std::ostream& operator<<(std::ostream& os, Fibonacci<T>& f) { return os << f.m_fibNum; } Fibonacci<T> operator+=(int k) { return m_fibNum += k; } Fibonacci<T> operator %(int k) { return m_fibNum % k; } Fibonacci<T> operator /(int k) { return m_fibNum / k; } bool operator<=(int k) { return m_fibNum < k; } bool operator >(int k) { return m_fibNum > k; } bool operator==(int k) { return m_fibNum == k; } private: void multiply(T F[2][2], T M[2][2]) { T x = F[0][0]*M[0][0] + F[0][1]*M[1][0]; T y = F[0][0]*M[0][1] + F[0][1]*M[1][1]; T z = F[1][0]*M[0][0] + F[1][1]*M[1][0]; T w = F[1][0]*M[0][1] + F[1][1]*M[1][1]; F[0][0] = x; F[0][1] = y; F[1][0] = z; F[1][1] = w; } /* Optimized version of power() */ void power(T F[2][2], T n) { if( n == 0 || n == 1) return; T M[2][2] = {{1,1},{1,0}}; this->power(F, n/2); multiply(F, F); if (n%2 != 0) multiply(F, M); } T fib(T n) { T F[2][2] = {{1,1},{1,0}}; if (n == 0) { return 0; } power(F, n-1); return F[0][0]; } T m_fibNum; }; // Returns n! (the factorial of n) int Factorial(int n) { int result = 1; for (int i = 1; i <= n; i++) { result *= i; } return result; } // Returns true if n is a prime number template<typename T> bool IsPrime(T n) { // Trivial case 1: small numbers if (n <= 1) return false; // Trivial case 2: even numbers if (n % 2 == 0) return n == 2; // Now, we have that n is odd and n >= 3. // Try to divide n by every odd number i, starting from 3 for (T i = 3; ; i += 2) { // We only have to try i up to the squre root of n if (i > n/i) break; // Now, we have i <= n/i < n. // If n is divisible by i, n is not prime. if (n % i == 0) return false; } // n has no integer factor in the range (1, n), and thus is prime. return true; } int main() { for(int i=0; i<300; ++i) { Fibonacci<unsigned long> f(i); if (IsPrime(f)) { std::cout << f << " is a prime number\n"; } } } |
Tuesday, January 15, 2019
Prime Number checking of Fibonacci sequence Number
Friday, November 30, 2018
Cheap Signal Analyzer
I bought this very cheap 8-input signal analyzer sometime ago on E-Bay, but since then never had time to use it, mostly due to the driver available was for Windows only. But a few days ago, I plugged it in on my Linux Mint and googled based on VID I found, I stumbled upon a cool opensource project called "SigOk", a complete project to support various embedded instruments, including my signal analyzer. It comes with a nice GUI front-end called "PulseView".
Operator Overloading in C++
// Assignment operators:
Type &operator&=(Type &lhs, const Type &rhs); // Assign bitwise and
Type &operator^=(Type &lhs, const Type &rhs); // Assign exclusive or
Type &operator|=(Type &lhs, const Type &rhs); // Assign bitwise or
Type &operator-=(Type &lhs, const Type &rhs); // Assign difference
Type &operator<<=(Type &lhs, const Type &rhs); // Assign left shift
Type &operator*=(Type &lhs, const Type &rhs); // Assign product
Type &operator/=(Type &lhs, const Type &rhs); // Assign quotient
Type &operator%=(Type &lhs, const Type &rhs); // Assign remainder
Type &operator>>=(Type &lhs, const Type &rhs); // Assign right shift
Type &operator+=(Type &lhs, const Type &rhs); // Assign sum
Type &operator&=(Type &lhs, const Type &rhs); // Assign bitwise and
Type &operator^=(Type &lhs, const Type &rhs); // Assign exclusive or
Type &operator|=(Type &lhs, const Type &rhs); // Assign bitwise or
Type &operator-=(Type &lhs, const Type &rhs); // Assign difference
Type &operator<<=(Type &lhs, const Type &rhs); // Assign left shift
Type &operator*=(Type &lhs, const Type &rhs); // Assign product
Type &operator/=(Type &lhs, const Type &rhs); // Assign quotient
Type &operator%=(Type &lhs, const Type &rhs); // Assign remainder
Type &operator>>=(Type &lhs, const Type &rhs); // Assign right shift
Type &operator+=(Type &lhs, const Type &rhs); // Assign sum
//Other modification operators
Type &operator--(Type &lhs); // Prefix decrement - decrement and return new value
Type operator--(Type &lhs, int unused); // Postfix decrement - decrement and return copy of old value
Type &operator++(Type &lhs); // Prefix increment - increment and return new value
Type operator++(Type &lhs, int unused); // Postfix increment - increment and return copy of old value
//Comparison operators
bool operator==(const Type &lhs, const Type &rhs); // Equal
bool operator>(const Type &lhs, const Type &rhs); // Greater than
bool operator>=(const Type &lhs, const Type &rhs); // Greater than or equal
bool operator<(const Type &lhs, const Type &rhs); // less than
bool operator<=(const Type &lhs, const Type &rhs); // less than or equal
bool operator!(const Type &lhs); // logical complement
bool operator!=(const Type &lhs, const Type &rhs); // no equal
bool operator==(const Type &lhs, const Type &rhs); // Equal
bool operator>(const Type &lhs, const Type &rhs); // Greater than
bool operator>=(const Type &lhs, const Type &rhs); // Greater than or equal
bool operator<(const Type &lhs, const Type &rhs); // less than
bool operator<=(const Type &lhs, const Type &rhs); // less than or equal
bool operator!(const Type &lhs); // logical complement
bool operator!=(const Type &lhs, const Type &rhs); // no equal
//Other operators
Type operator+(const Type &lhs, const Type &rhs); // Addition
Type operator+(const Type &lhs); // Unary plus
Type operator-(const Type &lhs, const Type &rhs); // Subtraction
Type operator-(const Type &lhs); // Unary minus
ContainedType* operator&(const Type &lhs); // Address of
Type operator&(const Type &lhs, const Type &rhs); // Bitwise and
Type operator~(const Type &lhs, const Type &rhs); // Bitwise complement
Type operator^(const Type &lhs, const Type &rhs); // Bitwise exclusive or
Type operator|(const Type &lhs, const Type &rhs); // Bitwise or
Type operator/(const Type &lhs, const Type &rhs); // Division
Type operator<<(const Type &lhs, const Type &rhs); // Left shift
Type operator*(const Type &lhs, const Type &rhs); // Multiplication
ContainedType &operator*(const Type &lhs); // Dereference
Type operator%(const Type &lhs, const Type &rhs); // Remainder
Type operator>>(const Type &lhs, const Type &rhs); // Right shift
Type operator+(const Type &lhs, const Type &rhs); // Addition
Type operator+(const Type &lhs); // Unary plus
Type operator-(const Type &lhs, const Type &rhs); // Subtraction
Type operator-(const Type &lhs); // Unary minus
ContainedType* operator&(const Type &lhs); // Address of
Type operator&(const Type &lhs, const Type &rhs); // Bitwise and
Type operator~(const Type &lhs, const Type &rhs); // Bitwise complement
Type operator^(const Type &lhs, const Type &rhs); // Bitwise exclusive or
Type operator|(const Type &lhs, const Type &rhs); // Bitwise or
Type operator/(const Type &lhs, const Type &rhs); // Division
Type operator<<(const Type &lhs, const Type &rhs); // Left shift
Type operator*(const Type &lhs, const Type &rhs); // Multiplication
ContainedType &operator*(const Type &lhs); // Dereference
Type operator%(const Type &lhs, const Type &rhs); // Remainder
Type operator>>(const Type &lhs, const Type &rhs); // Right shift
class Type
{
// Overloads which must be member functions
ContainedType &operator[](const IndexType &index); // Array subscript
Type &operator=(const Type &rhs); // Assignment
ContainedType &operator->*(); // Member reference
const ContainedType &operator->*() const; // Member reference
ContainedType &operator->(); // Member reference
const ContainedType &operator->() const; // Member reference
{
// Overloads which must be member functions
ContainedType &operator[](const IndexType &index); // Array subscript
Type &operator=(const Type &rhs); // Assignment
ContainedType &operator->*(); // Member reference
const ContainedType &operator->*() const; // Member reference
ContainedType &operator->(); // Member reference
const ContainedType &operator->() const; // Member reference
// Assignment operators
Type &operator&=(const Type &rhs); // Assign bitwise and
Type &operator^=(const Type &rhs); // Assign exclusive or
Type &operator|=(const Type &rhs); // Assign bitwise or
Type &operator-=(const Type &rhs); // Assign difference
Type &operator<<=(const Type &rhs); // Assign left shift
Type &operator*=(const Type &rhs); // Assign product
Type &operator/=(const Type &rhs); // Assign quotient
Type &operator%=(const Type &rhs); // Assign remainder
Type &operator>>=(const Type &rhs); // Assign right shift
Type &operator+=(const Type &rhs); // Assign sum
Type &operator&=(const Type &rhs); // Assign bitwise and
Type &operator^=(const Type &rhs); // Assign exclusive or
Type &operator|=(const Type &rhs); // Assign bitwise or
Type &operator-=(const Type &rhs); // Assign difference
Type &operator<<=(const Type &rhs); // Assign left shift
Type &operator*=(const Type &rhs); // Assign product
Type &operator/=(const Type &rhs); // Assign quotient
Type &operator%=(const Type &rhs); // Assign remainder
Type &operator>>=(const Type &rhs); // Assign right shift
Type &operator+=(const Type &rhs); // Assign sum
//Other modification operators
Type &operator--(Type &lhs); // Prefix decrement - decrement and return new value
Type operator--(Type &lhs, int unused); // Postfix decrement - decrement and return copy of old value
Type &operator++(); // Prefix increment - increment and return new value
Type operator++(int unused); // Postfix increment - increment and return copy of old value
Type &operator--(Type &lhs); // Prefix decrement - decrement and return new value
Type operator--(Type &lhs, int unused); // Postfix decrement - decrement and return copy of old value
Type &operator++(); // Prefix increment - increment and return new value
Type operator++(int unused); // Postfix increment - increment and return copy of old value
//Comparison operators
bool operator==(const Type &rhs) const; // Equal
bool operator>(const Type &rhs) const; // Greater than
bool operator>=(const Type &rhs) const; // Greater than or equal
bool operator<(const Type &rhs) const; // Less than
bool operator<=(const Type &rhs) const; // Less than or equal
bool operator!=(const Type &rhs) const; // Not equal
bool operator==(const Type &rhs) const; // Equal
bool operator>(const Type &rhs) const; // Greater than
bool operator>=(const Type &rhs) const; // Greater than or equal
bool operator<(const Type &rhs) const; // Less than
bool operator<=(const Type &rhs) const; // Less than or equal
bool operator!=(const Type &rhs) const; // Not equal
//Other operators
Type operator+(const Type &rhs) const; // Addition
Type operator+() const; // Unary plus
Type operator-(const Type &rhs) const; // Subtraction
Type operator-() const; // Unary minus
ContainedType* operator&(); // Address of
const ContainedType* operator&() const; // Address of
Type operator&(const Type &rhs) const; // Bitwise and
Type operator~(const Type &rhs) const; // Bitwise complement
Type operator^(const Type &rhs) const; // Bitwise exclusive or
Type operator|(const Type &rhs) const; // Bitwise or
ContainedType &operator*(); // Dereference
const ContainedType &operator*() const; // Dereference
Type operator/(const Type &rhs) const; // Division
Type operator<<(const Type &rhs) const; // Left shift
bool operator!() const; // Logical complement
Type operator*(const Type &rhs) const; // Multiplication
Type operator%(const Type &rhs) const; // Remainder
Type operator>>(const Type &rhs) const; // Right shift
};
Type operator+(const Type &rhs) const; // Addition
Type operator+() const; // Unary plus
Type operator-(const Type &rhs) const; // Subtraction
Type operator-() const; // Unary minus
ContainedType* operator&(); // Address of
const ContainedType* operator&() const; // Address of
Type operator&(const Type &rhs) const; // Bitwise and
Type operator~(const Type &rhs) const; // Bitwise complement
Type operator^(const Type &rhs) const; // Bitwise exclusive or
Type operator|(const Type &rhs) const; // Bitwise or
ContainedType &operator*(); // Dereference
const ContainedType &operator*() const; // Dereference
Type operator/(const Type &rhs) const; // Division
Type operator<<(const Type &rhs) const; // Left shift
bool operator!() const; // Logical complement
Type operator*(const Type &rhs) const; // Multiplication
Type operator%(const Type &rhs) const; // Remainder
Type operator>>(const Type &rhs) const; // Right shift
};
Example
Type& Type::operator = (Type const & rhs)
{
if (&rhs != this)
{
// perform assignment to the class T's attributes
}
// return by reference
return *this;
}
Type Type::operator &= (Type const & rhs)
{
return *this = (*this) & rhs;
}
Type Type::operator & (Type const & rhs)
{
Type newObjVal;
// do customized bitwise AND for the type against rhs
….
// return an object by value
return newObjVal;
}
Type& Type::operator++() // prefix
{
++m_data;
return *this;
}
class MyClass
{
public:
// conversion operator, so expression like: Type b = myClass;
operator Type() { return *m_ptr; }
...
private:
int m_data;
Type m_ptr;
};
MyClass& MyClass::operator++(int unused) // postfix
{
MyClassresult = *this;
++m_data;
// return value before increment
return result;
}
// Conversion operator
Tuesday, August 14, 2018
Pointers of String
It is always tricky dealing with string in C/C++, but if we know the rule of evaluation of expression in C++, it's not that hard to understand it.
A string declaration is always evaluated from right to left. For example, "char *str" is evaluated as "a variable with name 'str' is a pointer (*) of type char".
Another example:
"const char *str" is evaluated as variable str as a pointer of type char that is const (the content is immutable"). (Please remember, "const char .." expression is identical to expression "char const ...")
"char * const str" is evaluated as a variable with name 'str' is a constant pointer to type char, meaning once the pointer is initialized to point to a string, it cannot be changed to point to another string.
"char const * const str" is evaluated as "a variable with name 'str' is a constant pointer to constant char content. It is a combination to all above.
#include <iostream>
/*
char* str:
const char* str OR char const *str
char* const str:
const char* const str:
*/
#define L(v) #v << " = " << v
using namespace std;
static char cstr[] = "String ini statis!";
int main()
{
char* ps1; // just a regular pointer to a string
ps1 = cstr;
cout << L(ps1) << endl;
#if 0
char const * p_constr = cstr;
// the following causes compile error, as it tries to change value of the static string
*p_constr = '1';
cout << L(p_constr) << endl;
#endif
// a dialect of the above (char const *)
const char* p_constr2 = cstr;
*p_constr2 = '1';
cout << L(p_constr2) << endl;
#if 0
const char* const const_ptr = cstr; // the pointer cannot be set to different one
// the following will cause compile error
const_ptr = cstr2;
cout << L(const_ptr) << std::endl;
#endif
}
A string declaration is always evaluated from right to left. For example, "char *str" is evaluated as "a variable with name 'str' is a pointer (*) of type char".
Another example:
"const char *str" is evaluated as variable str as a pointer of type char that is const (the content is immutable"). (Please remember, "const char .." expression is identical to expression "char const ...")
"char * const str" is evaluated as a variable with name 'str' is a constant pointer to type char, meaning once the pointer is initialized to point to a string, it cannot be changed to point to another string.
"char const * const str" is evaluated as "a variable with name 'str' is a constant pointer to constant char content. It is a combination to all above.
#include <iostream>
/*
char* str:
const char* str OR char const *str
char* const str:
const char* const str:
*/
#define L(v) #v << " = " << v
using namespace std;
static char cstr[] = "String ini statis!";
int main()
{
char* ps1; // just a regular pointer to a string
ps1 = cstr;
cout << L(ps1) << endl;
#if 0
char const * p_constr = cstr;
// the following causes compile error, as it tries to change value of the static string
*p_constr = '1';
cout << L(p_constr) << endl;
#endif
// a dialect of the above (char const *)
const char* p_constr2 = cstr;
*p_constr2 = '1';
cout << L(p_constr2) << endl;
#if 0
const char* const const_ptr = cstr; // the pointer cannot be set to different one
// the following will cause compile error
const_ptr = cstr2;
cout << L(const_ptr) << std::endl;
#endif
}
Saturday, June 30, 2018
WeMos D1 WiFi uno based ESP8266 for arduino Compatible
www.aliexpress.com: $7.60, 5 Jan 2016
Docs: http://www.wemos.cc/d1/
http://www.wemos.cc/d1/Getting_Started
- based on the ESP-8266EX.
- Arduino Compatible, you can use it on Arduino IDE.
- 11 Digital I/O pins
- 1 Analog Input pin
- OTA -- Wireless Upload(Program)
- Onboard switching power supply -- Max 24V input, 5V 1A output
- All GPIOs are 3.3 volts only
cd ~/build
git clone https://github.com/esp8266/Arduino.git esp8266
#cd ~/sketchbook
cd /opt/Arduino/hardware
ln -s ~/build/esp8266 ./esp8266
cd ./esp8266/tools
sudo ./get.py
ARDUINO SKETCH
Board: WeMos D1
CPU Freq: 80 MHz
Upload using: Serial
Upload speed: 115200
Port:
Programmer: USBasp
Compile AVR code (ARDUINO NANO)
$(TOOLCHAIN_DIR)/avr-g++ -c -g -Os -std=gnu++11 -fno-exceptions \-ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega328p \
-DF_CPU=16000000L -DARDUINO=10607 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR \
"-I/opt/Arduino/hardware/arduino/avr/cores/arduino" \
"-I/opt/Arduino/hardware/arduino/avr/varians/eightanaloginputs"
<C/C++ source> -o <.o file>
TOOLCHAIN_DIR = /opt/Arduino/hardware/tools/avr/bin
or
/usr/bin
UPLOAD
with avrdude:/usr/bin/avrdude -q -V -p atmega328p -C /etc/avrdude.conf -D -c arduino -b 57600 -P /dev/ttyUSB0 \
-U flash:w:build-nano-atmega328/Blink.hex:i
make show_boards
Thursday, June 28, 2018
ESP32 from Espressif Systems
This beast is really awesome. For about $6 (on eBay), we can get a full functional IoT system using ESP32 application SoC made by a Chinese company called Espressif. The CPU core is based on XTensa architecture. XTensa is a CPU/MCU architecture designed by a Silicon Valley-based company named Cadence Tensilica. Cadence Tensilica, according to Wikipedia, was founded by the former co-founder of the MIPS Technologies (one of the first player in RISC CPU architecture), Chris Rowen.
Espressif bought the IP rights to use in their own SoC products such as in ESP32 series. ESP32 itself is an evolutional product of its predecessor, ESP8266. A lot of features in this tiny SoC, such as WiFi & Bluetooth, cryptographic co-processor, Hall sensor, generous amount of ADC inputs (but multiplexed with other GPIOs), 2 DAC outputs, SPI, I2S, I2C, ultra-low power coprocessor, Ethernet MAC MII interface (but we need to add PHY interface to connect to a medium), temperature sensor, touch sensors, CAN, 4 MB flash, etc.
Another interesting and cool thing is there a bunch of toolkits, SDK etc., including FreeRTOS support. Configuring the device can be as easy with menu-driven a-la Linux Kernel.
The Extensa ISA is actually a hybrid of RISC and CISC ISA. As detailed in the documents at Github, about it has about 80 RISC instructions with length 24 or 16-bit (unlike common RISC instructions which uniformly 32 bits). The architecture let the SoC designers customize it to add several extended CISC instructions to speed up and save memory space. The CPU endianness is also changeable between Little and Big endian.
The extended instructions, among others, are to support MAC (Multiply-Accumulate) which is common in DSP applications and other media processing operations. Another thing is the support for coprocessors.
Below is an example to blink the onboard LED (GPIO2) with FreeRTOS:
As described in https://www.freertos.org/a00125.html, the format of task creation API is:
BaseType_t xTaskCreate( TaskFunction_t pvTaskCode, const char * const pcName, unsigned short usStackDepth, void *pvParameters, UBaseType_t uxPriority, TaskHandle_t *pxCreatedTask )
Each task is assigned a priority from 0 to ( configMAX_PRIORITIES - 1 ), where 0 is the lowest priority and configMAX_PRIORITIES is defined within FreeRTOSConfig.h:
/* This has impact on speed of search for highest priority */
#ifdef SMALL_TEST
#define configMAX_PRIORITIES ( 7 )
#else
#define configMAX_PRIORITIES ( 25 )
#endif
Low priority numbers denote low priority tasks. The idle task has priority zero (tskIDLE_PRIORITY).
Espressif bought the IP rights to use in their own SoC products such as in ESP32 series. ESP32 itself is an evolutional product of its predecessor, ESP8266. A lot of features in this tiny SoC, such as WiFi & Bluetooth, cryptographic co-processor, Hall sensor, generous amount of ADC inputs (but multiplexed with other GPIOs), 2 DAC outputs, SPI, I2S, I2C, ultra-low power coprocessor, Ethernet MAC MII interface (but we need to add PHY interface to connect to a medium), temperature sensor, touch sensors, CAN, 4 MB flash, etc.
Another interesting and cool thing is there a bunch of toolkits, SDK etc., including FreeRTOS support. Configuring the device can be as easy with menu-driven a-la Linux Kernel.
The Extensa ISA is actually a hybrid of RISC and CISC ISA. As detailed in the documents at Github, about it has about 80 RISC instructions with length 24 or 16-bit (unlike common RISC instructions which uniformly 32 bits). The architecture let the SoC designers customize it to add several extended CISC instructions to speed up and save memory space. The CPU endianness is also changeable between Little and Big endian.
The extended instructions, among others, are to support MAC (Multiply-Accumulate) which is common in DSP applications and other media processing operations. Another thing is the support for coprocessors.
Below is an example to blink the onboard LED (GPIO2) with FreeRTOS:
/* Blink Example This example code is in the Public Domain (or CC0 licensed, at your option.) Unless required by applicable law or agreed to in writing, this software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ #include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/gpio.h" #include "sdkconfig.h" /* Can run 'make menuconfig' to choose the GPIO to blink, or you can edit the following line and set a number here. */ #define BLINK_GPIO CONFIG_BLINK_GPIO void blink_task(void *pvParameter) { /* Configure the IOMUX register for pad BLINK_GPIO (some pads are muxed to GPIO on reset already, but some default to other functions and need to be switched to GPIO. Consult the Technical Reference for a list of pads and their default functions.) */ gpio_pad_select_gpio(BLINK_GPIO); /* Set the GPIO as a push/pull output */ gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT); while(1) { /* Blink off (output low) */ gpio_set_level(BLINK_GPIO, 0); vTaskDelay(1000 / portTICK_PERIOD_MS); /* Blink on (output high) */ gpio_set_level(BLINK_GPIO, 1); vTaskDelay(1000 / portTICK_PERIOD_MS); } } void app_main() { xTaskCreate(&blink_task, "blink_task", configMINIMAL_STACK_SIZE, NULL, 5, NULL); }
As described in https://www.freertos.org/a00125.html, the format of task creation API is:
BaseType_t xTaskCreate( TaskFunction_t pvTaskCode, const char * const pcName, unsigned short usStackDepth, void *pvParameters, UBaseType_t uxPriority, TaskHandle_t *pxCreatedTask )
Each task is assigned a priority from 0 to ( configMAX_PRIORITIES - 1 ), where 0 is the lowest priority and configMAX_PRIORITIES is defined within FreeRTOSConfig.h:
/* This has impact on speed of search for highest priority */
#ifdef SMALL_TEST
#define configMAX_PRIORITIES ( 7 )
#else
#define configMAX_PRIORITIES ( 25 )
#endif
Low priority numbers denote low priority tasks. The idle task has priority zero (tskIDLE_PRIORITY).
Subscribe to:
Posts (Atom)