UP Task,Argpase
This commit is contained in:
106
lib/src/arg/argpase.c
Normal file
106
lib/src/arg/argpase.c
Normal file
@@ -0,0 +1,106 @@
|
||||
#include <malloc.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "argpase.h"
|
||||
|
||||
char *Optarg, *Optstr;
|
||||
int Optindex = 0;
|
||||
|
||||
OptList *Options_Creat(char *name, OptId index) {
|
||||
OptList *p;
|
||||
p = (OptList *) malloc(sizeof(OptList));
|
||||
memset(p, 0, sizeof(OptList));
|
||||
Option *opt = (Option *) malloc(sizeof(Option));
|
||||
memset(opt, 0, sizeof(Option));
|
||||
opt->name = name;
|
||||
opt->id = index;
|
||||
p->Option = opt;
|
||||
p->next = NULL;
|
||||
return p;
|
||||
}
|
||||
|
||||
OptList *Options_CreatOpt(Option *opt) {
|
||||
OptList *p;
|
||||
p = (OptList *) malloc(sizeof(OptList));
|
||||
memset(p, 0, sizeof(OptList));
|
||||
p->Option = opt;
|
||||
p->next = NULL;
|
||||
return p;
|
||||
}
|
||||
|
||||
void Options_Add(OptList *opts, OptList *opt) {
|
||||
OptList *p = opts;
|
||||
while (NULL != p->next) {
|
||||
p = p->next;
|
||||
}
|
||||
p->next = opt;
|
||||
}
|
||||
|
||||
bool Options_Del(OptList *opts, char *opt) {
|
||||
//获取当前头节点的位置
|
||||
OptList *p = opts;
|
||||
OptList *prev = NULL;
|
||||
while (NULL != p->next) {
|
||||
//保存当前节点的前一个节点的指针
|
||||
prev = p;
|
||||
//然后让当前的指针继续往后移动
|
||||
p = p->next;
|
||||
//判断,找到了要删除的数据
|
||||
if (0 == strcmp(p->Option->name, opt)) {
|
||||
//两种情况,一种是普通节点,还有一种是尾节点
|
||||
if (p->next != NULL) //普通节点的情况
|
||||
{
|
||||
prev->next = p->next;
|
||||
free(p);
|
||||
} else //尾节点的情况
|
||||
{
|
||||
prev->next = NULL; //将这个尾节点的上一个节点的指针域指向空
|
||||
free(p);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void Options_Print(OptList *opts) {
|
||||
OptList *p = opts;
|
||||
while (NULL != p) {
|
||||
printf("Option[%d]:%s\n", p->Option->id, p->Option->name);
|
||||
p = p->next;
|
||||
}
|
||||
}
|
||||
|
||||
OptId Options_Load(OptList *opts, char *argv[], size_t argc) {
|
||||
OptList *p = opts;
|
||||
OptId id = -2;
|
||||
while (NULL != p) {
|
||||
if (0 == strcmp(p->Option->name, argv[Optindex])) {
|
||||
Optarg = argv[Optindex + 1];
|
||||
Optstr = p->Option->name;
|
||||
id = p->Option->id;
|
||||
}
|
||||
p = p->next;
|
||||
}
|
||||
Optindex++;
|
||||
if (Optindex >= argc) {
|
||||
return -1;
|
||||
}
|
||||
return id;
|
||||
}
|
||||
|
||||
size_t Str_To_Args(char *str, char *argv[]) {
|
||||
char *p;
|
||||
size_t argc = 0;
|
||||
size_t l = strlen(str);
|
||||
char *buf = (char *) malloc(sizeof(char) * l + 1);
|
||||
strcpy(buf, str);
|
||||
p = strtok(buf, " ");
|
||||
while (p) {
|
||||
argv[argc] = p;
|
||||
argc++;
|
||||
p = strtok(NULL, " ");
|
||||
}
|
||||
return argc;
|
||||
}
|
||||
|
@@ -1,6 +1,6 @@
|
||||
#include "iic.h"
|
||||
|
||||
static inline void iic_Start(HW_Dev_IIC dev) {
|
||||
static inline void iic_Start(SW_Dev_IIC dev) {
|
||||
dev.SDA_MODE(OUT);
|
||||
dev.SDA_SET(HIGH);
|
||||
dev.CLK_SET(HIGH);DELAY1US();
|
||||
@@ -9,7 +9,7 @@ static inline void iic_Start(HW_Dev_IIC dev) {
|
||||
}
|
||||
|
||||
//结束信号
|
||||
static inline void iic_Stop(HW_Dev_IIC dev) {
|
||||
static inline void iic_Stop(SW_Dev_IIC dev) {
|
||||
dev.SDA_MODE(OUT);
|
||||
dev.CLK_SET(LOW);
|
||||
dev.SDA_SET(LOW);DELAY1US();
|
||||
@@ -18,7 +18,7 @@ static inline void iic_Stop(HW_Dev_IIC dev) {
|
||||
}
|
||||
|
||||
//等待信号响应
|
||||
static inline uint8_t iic_WaitAck(HW_Dev_IIC dev, uint16_t timeout) {
|
||||
static inline uint8_t iic_WaitAck(SW_Dev_IIC dev, uint16_t timeout) {
|
||||
uint16_t time = 0;
|
||||
dev.SDA_MODE(IN);
|
||||
dev.SDA_SET(HIGH);DELAY1US();
|
||||
@@ -34,7 +34,7 @@ static inline uint8_t iic_WaitAck(HW_Dev_IIC dev, uint16_t timeout) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void iic_Ack(HW_Dev_IIC dev) {
|
||||
static inline void iic_Ack(SW_Dev_IIC dev) {
|
||||
dev.CLK_SET(LOW);
|
||||
dev.SDA_MODE(OUT);
|
||||
dev.SDA_SET(LOW);DELAY1US();DELAY1US();
|
||||
@@ -42,7 +42,7 @@ static inline void iic_Ack(HW_Dev_IIC dev) {
|
||||
dev.CLK_SET(LOW);
|
||||
}
|
||||
|
||||
static inline void iic_NAck(HW_Dev_IIC dev) {
|
||||
static inline void iic_NAck(SW_Dev_IIC dev) {
|
||||
dev.CLK_SET(LOW);
|
||||
dev.SDA_MODE(OUT);
|
||||
dev.SDA_SET(HIGH);DELAY1US();DELAY1US();
|
||||
@@ -51,7 +51,7 @@ static inline void iic_NAck(HW_Dev_IIC dev) {
|
||||
}
|
||||
|
||||
//写入一个字节
|
||||
static inline void iic_W(HW_Dev_IIC dev, uint8_t date) {
|
||||
static inline void iic_W(SW_Dev_IIC dev, uint8_t date) {
|
||||
dev.SDA_MODE(OUT);
|
||||
uint8_t i;
|
||||
for (i = 0; i < 8; i++) {
|
||||
@@ -67,7 +67,7 @@ static inline void iic_W(HW_Dev_IIC dev, uint8_t date) {
|
||||
}
|
||||
}
|
||||
|
||||
static inline uint8_t iic_R(HW_Dev_IIC dev, uint8_t ack) {
|
||||
static inline uint8_t iic_R(SW_Dev_IIC dev, uint8_t ack) {
|
||||
unsigned char i, read = 0;
|
||||
dev.SDA_MODE(IN);
|
||||
for (i = 0; i < 8; i++) {
|
||||
@@ -83,7 +83,7 @@ static inline uint8_t iic_R(HW_Dev_IIC dev, uint8_t ack) {
|
||||
return read;
|
||||
}
|
||||
|
||||
void HW_IIC_WL(HW_Dev_IIC Dev, uint8_t InternalAddress, uint8_t *Write_Data, uint32_t Len) {
|
||||
void SW_IIC_WL(SW_Dev_IIC Dev, uint8_t InternalAddress, uint8_t *Write_Data, uint32_t Len) {
|
||||
iic_Start(Dev);
|
||||
iic_W(Dev, Dev.ADD);
|
||||
iic_WaitAck(Dev, 200);
|
||||
@@ -96,7 +96,7 @@ void HW_IIC_WL(HW_Dev_IIC Dev, uint8_t InternalAddress, uint8_t *Write_Data, uin
|
||||
iic_Stop(Dev);
|
||||
}
|
||||
|
||||
void HW_IIC_RL(HW_Dev_IIC Dev, uint8_t InternalAddress, uint8_t *Read_Data, uint32_t Len, uint8_t Ack) {
|
||||
void SW_IIC_RL(SW_Dev_IIC Dev, uint8_t InternalAddress, uint8_t *Read_Data, uint32_t Len, uint8_t Ack) {
|
||||
iic_Start(Dev);
|
||||
iic_W(Dev, Dev.ADD);
|
||||
iic_WaitAck(Dev, 200);
|
||||
|
@@ -4,7 +4,7 @@
|
||||
#define CS_ENABLE() Dev.CS ? Dev.CS_SET(HIGH) : Dev.CS_SET(LOW)
|
||||
#define CS_DISABLE() Dev.CS ? Dev.CS_SET(LOW) : Dev.CS_SET(HIGH)
|
||||
|
||||
static inline uint8_t spi_RW(HW_Dev_Spi Dev, uint8_t Write_Date) {
|
||||
static inline uint8_t spi_RW(SW_Dev_Spi Dev, uint8_t Write_Date) {
|
||||
uint8_t i, read_date = 0;
|
||||
switch (Dev.MODE) {
|
||||
case Mode0:
|
||||
@@ -67,7 +67,7 @@ static inline uint8_t spi_RW(HW_Dev_Spi Dev, uint8_t Write_Date) {
|
||||
return read_date;
|
||||
}
|
||||
|
||||
uint8_t HW_SPI_RW(HW_Dev_Spi Dev, uint8_t Write_Date) {
|
||||
uint8_t SW_SPI_RW(SW_Dev_Spi Dev, uint8_t Write_Date) {
|
||||
uint8_t read_date;
|
||||
CS_ENABLE();
|
||||
read_date = spi_RW(Dev, Write_Date);
|
||||
@@ -75,28 +75,28 @@ uint8_t HW_SPI_RW(HW_Dev_Spi Dev, uint8_t Write_Date) {
|
||||
return read_date;
|
||||
}
|
||||
|
||||
void HW_SPI_WL(HW_Dev_Spi Dev, uint8_t *Write_Date, uint32_t Len) {
|
||||
void SW_SPI_WL(SW_Dev_Spi Dev, uint8_t *Write_Date, uint32_t Len) {
|
||||
CS_ENABLE();
|
||||
for (uint32_t i = 0; i < Len; i++)
|
||||
spi_RW(Dev, Write_Date[i]);
|
||||
CS_DISABLE();
|
||||
}
|
||||
|
||||
void HW_SPI_RL(HW_Dev_Spi Dev, uint8_t *Read_Date, uint32_t Len) {
|
||||
void SW_SPI_RL(SW_Dev_Spi Dev, uint8_t *Read_Date, uint32_t Len) {
|
||||
CS_ENABLE();
|
||||
for (uint32_t i = 0; i < Len; i++)
|
||||
Read_Date[i] = spi_RW(Dev, 0xFF);
|
||||
CS_DISABLE();
|
||||
}
|
||||
|
||||
void HW_SPI_RWL(HW_Dev_Spi Dev, uint8_t *Read_Date, uint8_t *Write_Date, uint32_t Len) {
|
||||
void SW_SPI_RWL(SW_Dev_Spi Dev, uint8_t *Read_Date, uint8_t *Write_Date, uint32_t Len) {
|
||||
CS_ENABLE();
|
||||
for (uint32_t i = 0; i < Len; i++)
|
||||
Read_Date[i] = spi_RW(Dev, Write_Date[i]);
|
||||
CS_DISABLE();
|
||||
}
|
||||
|
||||
uint16_t HW_SPI_RW16(HW_Dev_Spi Dev, uint16_t Write_Date) {
|
||||
uint16_t SW_SPI_RW16(SW_Dev_Spi Dev, uint16_t Write_Date) {
|
||||
Data16 wdate16, rdate16;
|
||||
wdate16.u16 = Write_Date;
|
||||
CS_ENABLE();
|
||||
@@ -111,7 +111,7 @@ uint16_t HW_SPI_RW16(HW_Dev_Spi Dev, uint16_t Write_Date) {
|
||||
return rdate16.u16;
|
||||
}
|
||||
|
||||
void HW_SPI_RL16(HW_Dev_Spi Dev, uint16_t *Read_Date, uint32_t Len) {
|
||||
void SW_SPI_RL16(SW_Dev_Spi Dev, uint16_t *Read_Date, uint32_t Len) {
|
||||
Data16 rdate16;
|
||||
CS_ENABLE();
|
||||
switch (Dev.ENDIAN) {
|
||||
@@ -147,7 +147,7 @@ void HW_SPI_RL16(HW_Dev_Spi Dev, uint16_t *Read_Date, uint32_t Len) {
|
||||
CS_DISABLE();
|
||||
}
|
||||
|
||||
void HW_SPI_WL16(HW_Dev_Spi Dev, uint16_t *Write_Date, uint32_t Len) {
|
||||
void SW_SPI_WL16(SW_Dev_Spi Dev, uint16_t *Write_Date, uint32_t Len) {
|
||||
Data16 wdate16;
|
||||
CS_ENABLE();
|
||||
switch (Dev.ENDIAN) {
|
||||
@@ -183,7 +183,7 @@ void HW_SPI_WL16(HW_Dev_Spi Dev, uint16_t *Write_Date, uint32_t Len) {
|
||||
CS_DISABLE();
|
||||
}
|
||||
|
||||
void HW_SPI_RWL16(HW_Dev_Spi Dev, uint16_t *Read_Date, uint16_t *Write_Date, uint32_t Len) {
|
||||
void SW_SPI_RWL16(SW_Dev_Spi Dev, uint16_t *Read_Date, uint16_t *Write_Date, uint32_t Len) {
|
||||
Data16 wdate16, rdate16;
|
||||
CS_ENABLE();
|
||||
switch (Dev.ENDIAN) {
|
||||
|
49
lib/src/target.c
Normal file
49
lib/src/target.c
Normal file
@@ -0,0 +1,49 @@
|
||||
#include <errno.h>
|
||||
#include <sys/time.h>
|
||||
#include <target.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#if !defined(OS_USE_SEMIHOSTING)
|
||||
|
||||
#define STDIN_FILENO 0
|
||||
#define STDOUT_FILENO 1
|
||||
#define STDERR_FILENO 2
|
||||
|
||||
UART_HandleTypeDef *gHuart;
|
||||
|
||||
void RetargetInit(UART_HandleTypeDef *huart) {
|
||||
gHuart = huart;
|
||||
|
||||
/* Disable I/O buffering for STDOUT stream, so that
|
||||
* chars are sent out as soon as they are printed. */
|
||||
setvbuf(stdout, NULL, _IONBF, 0);
|
||||
}
|
||||
|
||||
__attribute__((unused)) int _write(int fd, char *ptr, int len) {
|
||||
HAL_StatusTypeDef hstatus;
|
||||
if (fd == STDOUT_FILENO || fd == STDERR_FILENO) {
|
||||
hstatus = HAL_UART_Transmit(gHuart, (uint8_t *) ptr, len, HAL_MAX_DELAY);
|
||||
if (hstatus == HAL_OK)
|
||||
return len;
|
||||
else
|
||||
return EIO;
|
||||
}
|
||||
errno = EBADF;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int _read(int fd, char *ptr, int len) {
|
||||
HAL_StatusTypeDef hstatus;
|
||||
|
||||
if (fd == STDIN_FILENO) {
|
||||
hstatus = HAL_UART_Receive(gHuart, (uint8_t *) ptr, 1, HAL_MAX_DELAY);
|
||||
if (hstatus == HAL_OK)
|
||||
return 1;
|
||||
else
|
||||
return EIO;
|
||||
}
|
||||
errno = EBADF;
|
||||
return -1;
|
||||
}
|
||||
|
||||
#endif //#if !defined(OS_USE_SEMIHOSTING)
|
131
lib/src/task/task.c
Normal file
131
lib/src/task/task.c
Normal file
@@ -0,0 +1,131 @@
|
||||
#include "task.h"
|
||||
#include <malloc.h>
|
||||
#include <string.h>
|
||||
|
||||
static Task_t *TaskHead = NULL;
|
||||
static PlatformTicksFunc_t platformTicksFunc = NULL;
|
||||
|
||||
TaskStatus_t TaskInit(PlatformTicksFunc_t ticksFunc) {
|
||||
platformTicksFunc = ticksFunc;
|
||||
TaskHead = (Task_t *) malloc(sizeof(Task_t));
|
||||
memset(TaskHead, 0, sizeof(Task_t));
|
||||
TaskHead->enable = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
TaskStatus_t TaskCreat(Task_t *task, TaskTime_t time, TaskCnt_t runcnt, Task_Callback_t callback, void *userdata) {
|
||||
if (!callback) {
|
||||
return false;
|
||||
}
|
||||
if (task) {
|
||||
TaskDel(task);
|
||||
}
|
||||
task = (Task_t *) malloc(sizeof(Task_t));
|
||||
memset(task, 0, sizeof(Task_t));
|
||||
task->intervaltime = time;
|
||||
task->lasttime = platformTicksFunc() + task->intervaltime;
|
||||
task->runcnt = runcnt;
|
||||
task->enable = true;
|
||||
task->callback = callback;
|
||||
task->userdata = userdata;
|
||||
task->next = NULL;
|
||||
return TaskAdd(task);;
|
||||
}
|
||||
|
||||
TaskStatus_t TaskAdd(Task_t *task) {
|
||||
if (task == NULL) {
|
||||
return false;
|
||||
}
|
||||
Task_t *p = TaskHead;
|
||||
while (p->next != NULL) {
|
||||
p = p->next;
|
||||
}
|
||||
p->next = task;
|
||||
return true;
|
||||
}
|
||||
|
||||
TaskStatus_t TaskDel(Task_t *task) {
|
||||
if (task == NULL) {
|
||||
return false;
|
||||
}
|
||||
Task_t *p = TaskHead;
|
||||
Task_t *prev = NULL;
|
||||
while (p->next != NULL) {
|
||||
//保存当前节点的前一个节点的指针
|
||||
prev = p;
|
||||
//然后让当前的指针继续往后移动
|
||||
p = p->next;
|
||||
//判断,找到了要删除的数据
|
||||
if (p == task) {
|
||||
//两种情况,一种是普通节点,还有一种是尾节点
|
||||
if (p->next != NULL) //普通节点的情况
|
||||
{
|
||||
prev->next = p->next;
|
||||
free(p);
|
||||
p = NULL;
|
||||
} else //尾节点的情况
|
||||
{
|
||||
prev->next = NULL; //将这个尾节点的上一个节点的指针域指向空
|
||||
free(p);
|
||||
p = NULL;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
TaskStatus_t TaskStart(Task_t *task) {
|
||||
if (task == NULL) {
|
||||
return false;
|
||||
}
|
||||
if (task->runcnt == 0) { task->runcnt = 1; }
|
||||
task->enable = true;
|
||||
task->lasttime = platformTicksFunc() + task->intervaltime;
|
||||
return true;
|
||||
}
|
||||
|
||||
TaskStatus_t TaskStop(Task_t *task) {
|
||||
if (task == NULL) {
|
||||
return false;
|
||||
}
|
||||
task->enable = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
TaskStatus_t TaskSetCnt(Task_t *task, TaskCnt_t runcnt) {
|
||||
if (task == NULL) {
|
||||
return false;
|
||||
}
|
||||
task->runcnt = runcnt;
|
||||
if (!task->enable && runcnt != 0) task->enable = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
TaskStatus_t TaskSetTime(Task_t *task, TaskTime_t time) {
|
||||
if (task == NULL) {
|
||||
return false;
|
||||
}
|
||||
task->intervaltime = time;
|
||||
return true;
|
||||
}
|
||||
|
||||
TaskStatus_t TaskRun(void) {
|
||||
Task_t *p = TaskHead;
|
||||
while (p != NULL) {
|
||||
if (p->enable == true && platformTicksFunc() >= p->lasttime) {
|
||||
if (p->runcnt == 0) {
|
||||
p->enable = false;
|
||||
p->lasttime = 0;
|
||||
} else if (p->runcnt > 0) {
|
||||
p->runcnt--;
|
||||
}
|
||||
if (p->callback) {
|
||||
p->callback(p, p->userdata);
|
||||
p->lasttime = platformTicksFunc() + p->intervaltime;
|
||||
}
|
||||
}
|
||||
p = p->next;
|
||||
}
|
||||
return true;
|
||||
}
|
Reference in New Issue
Block a user