关于ucos主函数调用OSTaskCreate创建用户的警告解决办法

1/所存在的问题描述,

在工程main.c编译时,keilMDK报出警告具体如下,

warning:  #167-D: argument of type "void (*)(void)" is incompatible with parameter of type "void (*)(void *)"

2/导致问题的原因,

经您提醒和keil的警告定位,我们可以锁定出现问题的代码为主函数中的

OSTaskCreate(my_task,(void*)0, (OS_STK *)&task_stk[127], 10);

函数中的参数给定形式不规范,我们讨论的结果是在第二个参数 (void*)0 或者 在用户任务函数声明时用户任务的形参问题。

结果经过初步几次的改动发现问题并没有解决。

于是我通过调试进入函数OSTaskCreate的源代码去查看,发现OSTaskCreate函数被调用时需要传的参数中第一个参数的形式为

void   (*task)(void *p_arg)

也即是OSTaskCreate的第一个参数需要传一个void fun_name(void*)类型的函数指针,这跟我们在main.c中所定义的用户任务

形式有差别,于是我回到main.c中将用户任务的声明改为void my_task(void*); 发现编译时警告没了。

所以,对于该问题出现的原因应该是我们工程中对于用户任务函数的声明定义的不规范导致的,并不是主函数中OSTaskCreate调用

时所给定传递参数不规范的原因。

3/解决办法及测试

解决办法:在一开始对用户任务的声明必须为void task_name(void *task_arg)的这种格式[函数的参数要采用void*],

也即是在调用OSTaskCreate函数时第一个参数的形式必须为上述类型的函数指针,否则报出警告。

测试:

首先我们声明一个全局结构体类型,

typedef struct

{

char a;

int b;

}test_str;

然后在主函数中声明定义一个该结构体类型的变量

test_str temp;

temp.a = 1;

temp.b = 2;

并在调用OSTaskCreate时把它作为第二个参数进行传递,

最后在用户任务中对该参数进行强制转换使用即可。

void my_task(void *arg)
{
test_str *my_arg=arg;

sys_init();
led_init();
OSStatInit();
while(1)
{
LED1_ON;
LED2_OFF;
OSTimeDly(my_arg->b*50);
LED1_OFF;
LED2_ON;
OSTimeDly(100);
}
}

编译没有报出警告,进入调试,结果能正常传递数据,问题解决。

原文地址:https://www.cnblogs.com/banmablog/p/11141546.html

时间: 2024-10-20 00:13:49

关于ucos主函数调用OSTaskCreate创建用户的警告解决办法的相关文章

sql server 2008 不允许保存更改,您所做的更改要求删除并重新创建以下表 的解决办法

启动SQL Server 2008 Management Studio 工具菜单----选项----Designers(设计器)----阻止保存要求重新创建表的更改  取消勾选即可. sql server 2008 不允许保存更改,您所做的更改要求删除并重新创建以下表 的解决办法,布布扣,bubuko.com

Linux系统root用户忘记密码解决办法

一.centos6 root用户忘记密码解决办法 1.grub未加密(知道grub密码)root密码找回办法: (1)重启系统,在系统等待时间按任意键进入如图一所示界面 图一 (2)在图一所示界面中按"e"键进入如图二所示界面 图二 (3)在图二所示的界面中选择第二项,并按"e"进入图三所示界面 图三 (4)在图三所示的界面中quite后面加参数single或者数字1,按回车回到图二所示的界面,选择第二项,按"b"进入系统,此时,进入系统不需要密

Mysql忘记用户密码的解决办法

1.1 忘记用户密码的解决办法 普通用户,直接用root超级管理员登录进去修改密码就可以了,但是如果root密码丢失了,怎么办呢? 1.1.1 msyqld_saft方式找回密码 停止mysql:service mysqld stop; 安全模式启动:mysqld_safe –skip-grant-tables & 无密码回车键登录:mysql -uroot –p 重置密码:use mysql; update user set password=password('') where user='

ORCALE 创建用户 ORA-65096 错误解决

当使用之前版本的sql语法在12c中建立user时,若时使用pluggable database,会ORA-65096抛出异常. 执行命令: select pdb_id,pdb_name,dbid,status,creation_scn from dba_pdbs; 执行命令 alter session set container=ORCLPDB; 再创建用户 create user test identified by test; 原文地址:https://www.cnblogs.com/yg

[angular2/4/8]用ng new创建项目卡住的解决办法

官方文档 英文版:https://angular.io/guide/quickstart 中文版:https://angular.cn/guide/quickstart Installing packages for tooling via npm. 在创建新项目时,这一步需要通过npm安装依赖包,于是卡住了 解决办法: ng new my-app --skip-install 然后进入my-app项目中,执行cnpm install安装依赖包(当然首先你要全局安装cnpm) 如果这句不行,就用

SequoiaDB报告创建线程失败的解决办法

1.问题背景 对于分布式数据库和分布式环境,高并发和高性能压力的情况下,出现线程创建失败等等问题也是十分常见的,这时候就十分考虑数据库管理员的经验,需要能快速的定位到问题和瓶颈所在,快速解决.本文也是作为一个最佳实践,告诉大家如何在高并发情况下定位问题,排除问题,解决瓶颈. 2.问题定位 SequoiaDB在集群环境中的 -10 错误码,在认真查阅节点的 diaglog 日志后,发现是操作系统 create thread 失败的问题. 如我们的测试环境下,SequoiaDB节点的 diaglog

“阻止保存要求重新创建表的更改”解决办法

在修改数据库表结构时提示[不允许保存更改.您所做的更改要求删除并重新创建以下表.您对无法重新创建的标进行了更改或者启用了"阻止保存要求重新创建表的更改"选项.] 这是因为SQL2008默认阻止保存要求重新创建表的更改.只需要更改一下设置就可以了. 点击SQL2008菜单中的工具->选项. 点击Designers选项. 原来[阻止保存要求重新创建表的更改]选项前的复选框是打对勾的,把对勾取消确定就可以了. 之后更改表就可以保存了. 版权声明:本文为博主原创文章,未经博主允许不得转载

Entity Framework 无法对没有主键的视图映射实体的解决办法

我们在使用Entity Framework的时候经常会把数据库中的某一个视图映射为EF的实体,但是如果数据库视图中的列没有包含表的主键列,EF会报出警告说视图没有主键,导致映射为实体失败错误如下: 表/视图“{0}”未定义主键,无法推断有效的主键.已排除该表/视图.要使用该实体,您将需要检查架构,添加正确的键并对它取消注释. English translation: The table/view '{0}' does not have a primary key defined and no v

weiphp 3.0创建插件提示错误解决办法 提示您没有创建目录写入权限,

环境 linux weiphp3.0 步骤: 创建weiphp插件的时候提示 目录不可写入 解决方法: 查看是/Admin/Plugin/create.html 这个文件提示的 找到 Application\Admin\Controller 目录下的 PluginController.class.php 发现目标代码 // 创建向导首页 public function create() { if (! is_writable ( ONETHINK_PLUGIN_PATH )) $this->er