作者丨Sean Ye
责编 | 伍杏玲
本文经授权转载自瞎说职场(ID:HRInsight)
2016年,史玉柱的巨人网络陷入困境。
热心如马云老师,毫无保留滴向史玉柱传授了“狼兔同窝”理论。
以巨人、脑白金起家的史玉柱是个“实诚”人。他随后在微博上感谢马云老师,表示即使被误会,也要赶走兔子,打造“狼性团队”(结果落地实操是“末尾淘汰”)。
2019年的今天,马云老师再次出山,推出了“996修福论”,把「996」等同于「奋斗」,又掀起一波惊涛骇浪。
你怕是对狼有什么误解
这些年来,狼总是给民族企业家背锅,被误会成内部自裁,不顾弱小的种族。
其实,我们小时候学过一个成语,叫做「狼狈为奸」。
狈,据说是一种长得很像狼,但是前腿短的动物,总扒在狼身上,一起行动,狼负责坏,狈负责出坏主意。但是,狈没有独自生活的能力:一旦没有狼的扶助,就动弹不得。
我一直看《动物世界》,都没看过狈这种动物。
后来才知道,所谓「狈」就是被捕兽夹夹断前腿的狼。因为狼是群体生活的动物,不会遗弃自己的同伴。
所以会让受伤同伴的一双短前腿放在自己背上,以便一起行动。
连残疾的,脱离队友动都动不了的同事,都不放弃。你看过哪家狼群,每个季度搞末尾淘汰10%的策略的?
作为民族企业家,洗脑,也要讲基本法的吧。
话说回来,狗性精神还是很管用的。
2016年,史玉柱发布「马云教我兔子论」的时候,巨人网络的股价只有34元,一年后,巨人网络的股价就猛涨到77元。
可谓是立竿见影。
对了,巨人网络现在的股价是20……
谁是兔子
阿里根据「业绩」和「价值观」两个象限的评估标准,将员工分成四种类型:
-
开除:没有业绩,也没有价值观;
-
野狗:有业绩、没价值观;
-
兔子:认同价值观,但没有业绩;
-
猎犬(狼群):既有业绩,也有价值观。
很多领导喊着要狼性团队。实际上,他们要的不是狼。
狼绝不抛弃弱小成员的作风,是不符合老板期待的丛林法则。
大多数老板喊着团队精神团队利益,其实想的是“我就是团队,团队要保证我的利益”。
所以老板们最期待的员工,是「猎犬」。不但能力出众,而且任劳任怨唯命是从,其实猎犬,或者说狗,更合适。
但是能力超强的狗,真不好找。越是能力强,越有自己的想法和主见。但凡哪天狗想通了,他就去创业,打造自己的狗性团队去了。
作为老板,是很难退而求其次的。
价值观不符,但有能力的人,会挑战自己的利益和权威。Pass。
价值观符合,但没有能力的人,虽然一时爽,但迟早公司会玩玩的。Pass。
等等……野狗不会变装,但是兔子是擅长易容的。
兔子深谙职场潜规则,老板发言他鼓掌,老板发票圈他点赞,老板提要求他表决心。
马云老师要求的奋斗精神,兔子可以马上上手。白天“努力”,晚上不回家,在公司加班,再配合上一些励志的朋友圈:
你看过凌晨四点的钱塘江吗?
老板是个矛盾体,他很痛恨兔子。
马云对史玉柱说:“兔子虽然认同企业价值观,但是没有能力,兔子如果混得好,会带坏很多普通员工,对企业危害很大。”
猎豹移动CEO傅盛也表态:“最可怕的兔子是整天都在忙,就是不出活儿”,“还会眼泪汪汪看着你,觉得自己对公司有感情”,他甚至表示 “赶走兔子,宁可错赶,不可错漏。”
两位老板说得很对。
不过,知易行难。
钉钉有一个「下班后哪个员工最先走」的排序功能,可以说是摸准了很多老板的心态。
对老板来说,尤其是不懂人力资源的老板来说,绩效好坏很难衡量,但是谁加班勤快,一眼就看出来了。
员工不是傻子。
如果看到优秀人才加薪晋升了,他们就会努力把自己变得优秀。
如果兔子升职加薪,小白兔活成大白兔了。那就转型做兔子呗。
优秀的门槛很高,但兔子的门槛却很低,只要听话努力,或者看起来很努力就行了。这样一来,兔子更容易得到管理层的关照,抢走优秀员工的资源和晋升机会。
优秀员工一瞅:我这么高效,升职加薪的机会却被兔子给拿走了,那我有什么必要在贵司继续待下去呢?
公司推行996,往往最先受不了的是人才。因为有能力的人,在其他地方也找得到好工作。
而没本事干活,却善于做表面功夫的兔子,最优选择一定不是去新的环境重新装过,而是留下继续晒勤奋,老板的钱其实是扔到了无效的加班时间里了。
养生996的崛起
如今,各位老板清一色的996,甚至789配置,对于优秀员工来说,是致命的。
因为高效,是很难每天持续12个小时的。
一个成年人,能在一件事上聚精会神4个小时,那已经是奇迹了。即使是最钟爱的游戏,打四个小时,也要起来走两步吧。
持续的加班,会严重降低员工的效率。
澳大利亚国立大学有一个调研,说是员工每周工作超过39小时,就会威胁身体健康——土澳人实在是太弱了。
我们勤劳俭朴的中国人,可比土澳强多了。
即便如此,996长达每周72小时的工作方式,一定会严重伤害员工的身心健康。
在Mercer2016年中国最佳健康雇主调研时,我们就发现:50%的受访员工,存在压力过大的心理健康问题。
如果整个生态,让有能力的员工,无法生存。那么胜出的是谁呢?
恭喜兔子,在老板们的助攻下喜提冠军。
我曾经和一个996公司的员工聊天,问他压力大不大。
他回答:还好啦,早上10点到。先泡茶,吃早饭,再和同事们吹吹牛,很快早上就过去了。
中午吃完饭后,午睡到下午2点,出门弄杯咖啡,然后回来开始正式干活,干到6点吃饭,吃完饭后各个团队的需求都来了,然后再熬夜。
所以实际上,他下午2点以后开始正式干活,还要吃个晚饭,那的确得干到11点啊。
这就是所谓的养生996。
我问:你不能早上把活干了,早点回家吗?
他回答:首先,早回家的话老板视为没有团队精神的眼中钉;其次,早上来,也没活干啊,需求都是下班前才给到的。这不是我一个人的习惯,这是整个公司的习惯。
达尔文应该很欣慰,这是进化论的社会版本:
-
有提倡感恩公司的老板,就一定有永远爱公司,永远热泪盈眶的员工;
-
有提倡末位淘汰的老板,就一定有假装狼性文化的哈士奇员工;
-
有提倡加班文化的老板,就一定有深更半夜发朋友圈炫加班的员工。
老板敢于让员工加班,员工就敢养身996忽悠老板。
反正你老板并没有评估绩效的能力,只会看时长,我就睡在公司吃鸡,好不好?
万恶的资本家?
每次有996的新闻,就一定有马克思、资本论刷屏的机会。
复制黏贴这段文字,可以保底获得500赞:
“如果有10%的利润,它就保证到处被使用;有20%的利润,它就活跃起来;有50%的利润,它就铤而走险;为了100%的利润,它就敢践踏一切人间法律;有300%的利润,它就敢犯任何罪行,甚至冒绞首的危险。”
实际上,如今的外资公司还真干不出这没良心的事情。
谷歌996吗?苹果996吗?辉瑞996吗?最压榨员工,最那啥的伊隆·马斯克,也没胆量喊常态性加班。
马斯克隐晦的在Twitter上表示,员工为什么组建工会付工会费,而放弃股票期权呢。然后被美国全国劳资关系委员会(National Work Relations Board)投诉马斯克违反劳动法开展调查。
特斯拉也是麻烦重重。
而谷歌,因为员工反对人工智能用于武器,甚至不得不放弃了美国军方的高额订单。
资本家已经证明了不靠996,向人才让渡权力,企业也能够活得很好。
对于老板来说,996最大的价值,不在于提升企业效率,而在于把员工绑定在公司里,你不要有家,不要有私人生活,不要有跳槽的想法——就算有,你也没时间去面试。
作为中国史上最成功的创业者,给996站台,这招其实很狡猾。
很多创业企业都中了毒,觉得有了996,有了政委,就能复制马云的成功。
事实上,马云为什么成功?
在我看来,马云有两点常人远不能及的优点:
1、愿意分钱
对于企业家来说,有一个真理,财聚人才,财散人聚。
他在刚刚开始创业的时候,马云就愿意把股权分给身边的小伙伴。而蔡崇信,帮助马云设计了清晰的股权规划及股权激励。
华为也是如此。任正非的成功,不在于搞狼性精神,而在于他很早就开始在华为搞全员持股。
这才是现代企业成功的基础:一起奋斗一起成功。
2、有远见
企业的成功与否,往往取决于企业能不能抓住时代的红利。
BAT抓住了互联网时代的红利,TMD(头条美团滴滴)抓住了移动互联网的红利。
马云就更厉害了,淘宝抓住了C2C电商崛起的红利期,天猫抓住了消费升级的红利期,余额宝精准打击了不作为的银行业,如今支付宝的芝麻信用,O2O的盒马鲜生,以及产业互联网的阿里云和阿里钉钉都走在市场前列。
过去,在每一波红利,马云都没有错过。
而如今的马云老师掌握了足够前沿的信息,帮助他做出一个个普通人无法企及的精准预判。
如果再加一个,我想是重视家庭:尽管站台996,但马云自己对家人的保护做得极好,早早退休也部分是为了更好照顾家人。
对于普通企业主来说,你要想想:
-
你有没有马云当年分钱的胆识?
-
你有没有马云精准的眼光?
你自己差距那么大,方向都找不准,当然不能成功。别说996,就算是7x24,你依然不能成功。
你可能不知道,马云和任正非赶上了好时候,当年的70-80后都是被勤奋、努力、忍耐的精神熏陶大的。
而如今的90后新生代员工,最常放在嘴上的是「选择比努力更重要」。
创业者们,面对马老师这位老江湖,你们想要成功,就得找点差异化的竞争策略。否则,你的企业未来只有被马云老师持续吊打而已。
从月薪 1000 到 2W+,文科生如何逆袭成为大厂程序员?
作者简介:瞎说职场(HRInsight)是Sean分享人力资源行业12年从业经验感悟的地方,主要内容涉及:职业规划,个人职场提升以及求职面试建议。
Sean拥有10多年的人力资源行业经验,先后供职于全球领先的人力资源服务机构Randstad和咨询公司Mercer。工作之余,Sean的身份还包括第一财经/南都周刊/领英专栏作家,知乎人力资源优秀回答者。
长三角开发者联盟
代码就是力量,长三角的开发者联合起来!
加入「长三角开发者联盟」将获得以下权益
长三角地区明星企业内推岗位
CSDN独家技术与行业报告
CSDN线下活动优先参与权
CSDN线上分享活动优先参与权
扫码添加联盟小助手,回复关键词“长三角2”,加入「长三角开发者联盟」。
作为码一代,想教码二代却无从下手:
听说少儿编程很火,可它有哪些好处呢?
孩子多大开始学习比较好呢?又该如何学习呢?
最新的编程教育政策又有哪些呢?
下面给大家介绍CSDN新成员:极客宝宝(ID:geek_baby)
戳他了解更多↓↓↓
热 文 推 荐
☞ 微软 GitHub 超百名工程师联名:我们挺 996.ICU!绝不删库跑路!
☞ Elastic Jeff Yoshimura:开源正在开启新一轮的创新 | 人物志
☞ 19岁当老板, 20岁ICO失败, 21岁将项目挂到了eBay, 为何初创公司如此艰难?
System.out.println("点个在看吧!");
console.log("点个在看吧!");
print("点个在看吧!");
printf("点个在看吧!\n");
cout << "点个在看吧!" << endl;
Console.WriteLine("点个在看吧!");
Response.Write("点个在看吧!");
alert("点个在看吧!")
echo "点个在看吧!"
你点的每个“在看”,我都认真当成了喜欢



FreeRTOS静态任务创建
📢 重要通知: 本教程所有项目已开源到GitHub: Despacito0o/FreeRTOS,欢迎Star⭐和Fork!
FreeRTOS中静态任务与动态任务的区别
一、内存分配方式
-
静态任务
- 在编译时分配内存,需用户手动定义
StaticTask_t
任务控制块(TCB)和StackType_t
任务栈数组。 - 内存由用户预先分配的全局变量或静态变量提供,存放在静态存储区,生命周期与程序一致。
- 优点:内存使用可预测,无动态内存分配开销,避免内存碎片问题,适合对实时性要求高的场景。
- 在编译时分配内存,需用户手动定义
-
动态任务
- 在运行时通过
pvPortMalloc()
动态分配内存,系统自动管理栈和TCB。 - 内存从FreeRTOS管理的堆中分配,任务删除后自动释放资源。
- 优点:灵活性高,支持运行时动态调整任务数量,适合需要频繁创建/删除任务的场景。
- 在运行时通过
二、创建函数与参数
-
静态任务函数(
xTaskCreateStatic
)- 需用户传入预分配的栈缓冲区(
puxStackBuffer
)和任务控制块指针(pxTaskBuffer
)。 - 示例:
// 定义任务栈数组,大小为128个字 StackType_t xTaskStack[128]; // 定义任务控制块 StaticTask_t xTaskTCB; // 创建静态任务,传入任务函数、任务名称、栈大小、参数、优先级、栈数组和控制块 xTaskCreateStatic(TaskFunc, "Task", 128, NULL, 1, xTaskStack, &xTaskTCB);
- 1
- 2
- 3
- 4
- 5
- 6
- 需用户传入预分配的栈缓冲区(
-
动态任务函数(
xTaskCreate
)- 仅需指定栈深度,系统自动分配内存。
- 示例:
// 创建动态任务,系统自动分配内存 // 参数依次为:任务函数、任务名称、栈大小、参数、优先级、任务句柄 xTaskCreate(TaskFunc, "Task", 128, NULL, 1, NULL);
- 1
- 2
- 3
三、适用场景
静态任务 | 动态任务 |
---|---|
内存受限的嵌入式系统(如无堆管理模块) | 需要动态调整任务数量的复杂系统 |
确定性要求高的实时系统(如航空航天设备) | 事件驱动型应用(如按键触发任务) |
需避免内存碎片的核心任务(如通信协议栈) | 调试场景(临时添加监控任务) |
四、配置与资源管理
-
静态任务
- 需配置宏
configSUPPORT_STATIC_ALLOCATION=1
。 - 必须实现
vApplicationGetIdleTaskMemory
和vApplicationGetTimerTaskMemory
函数,为空闲任务和定时器任务分配内存。
- 需配置宏
-
动态任务
- 需配置宏
configSUPPORT_DYNAMIC_ALLOCATION=1
。 - 依赖内存管理文件(如
heap_4.c
),需确保堆空间充足。
- 需配置宏
五、性能与稳定性对比
- 资源占用:静态任务无内存分配/释放开销,适合长期运行的固定任务;动态任务可能因频繁分配导致内存碎片。
- 错误风险:静态任务需用户保证栈空间足够,否则可能溢出;动态任务需防止内存不足导致的创建失败。
- 调试复杂度:静态任务的内存问题更易追踪(地址固定);动态任务的内存泄漏需借助工具检测。
总结建议
- 选择静态任务:当系统要求确定性、资源受限或需长期稳定运行核心功能时。
- 选择动态任务:在需要灵活扩展、临时任务管理或资源充足的中大型应用中。
可通过修改FreeRTOS配置文件(FreeRTOSConfig.h
)中的宏定义来切换两种任务创建模式。
动手实践:创建FreeRTOS静态任务
1. 项目准备
首先,复制我们上节课创建的003项目,并重命名为004。
2. 注释动态任务代码
打开004项目,先编译一下确保项目没有问题,然后将上一次动态创建的任务代码注释掉。
3. 启用静态任务创建宏
导航到freertos.h文件,启用静态任务创建的宏定义:
// 启用静态任务创建支持
#define configSUPPORT_STATIC_ALLOCATION 1
- 1
- 2
4. 编译检查错误
编译项目,发现有一个报错。这是因为启用静态任务创建后,我们需要实现一个接口函数。
5. 查看错误原因
根据报错内容,导航到task.c文件,发现系统只是声明了这个函数,我们需要在main文件中实现它。
6. 复制函数声明到main文件
将这个函数声明复制到main文件中准备实现:
// 为空闲任务提供内存的函数
// 参数1:任务控制块的二级指针
// 参数2:任务栈的二级指针
// 参数3:任务栈大小的指针
void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,
StackType_t ** ppxIdleTaskStackBuffer,
uint32_t * pulIdleTaskStackSize );
- 1
- 2
- 3
- 4
- 5
- 6
- 7
7. 定义空闲任务控制块
第一个参数是任务控制块,我们需要定义一个StaticTask_t类型的变量:
// 定义空闲任务控制块
StaticTask_t IdleTaskTCB;
- 1
- 2
8. 定义空闲任务栈
第二个参数需要一个堆栈空间,第三个是堆栈空间大小。我们可以使用FreeRTOSConfig.h中定义的configMINIMAL_STACK_SIZE作为数组大小:
// 定义空闲任务栈数组,大小为最小栈大小
StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];
- 1
- 2
9. 实现接口函数
现在我们来实现这个接口函数,为空闲任务提供必要的内存资源:
void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,
StackType_t ** ppxIdleTaskStackBuffer,
uint32_t * pulIdleTaskStackSize )
{
// 为函数参数赋值,提供任务控制块地址
*ppxIdleTaskTCBBuffer = &IdleTaskTCB;
// 提供任务栈数组地址
*ppxIdleTaskStackBuffer = IdleTaskStack;
// 提供任务栈大小
*pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
10. 查看静态任务创建函数原型
导航到task.c文件,查看静态任务创建函数的原型,了解我们需要传入的参数:
TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,
const char * const pcName,
const uint32_t ulStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
StackType_t * const puxStackBuffer,
StaticTask_t * const pxTaskBuffer )
- 1
- 2
- 3
- 4
- 5
- 6
- 7
11. 创建自定义静态任务
回到main函数,为我们的自定义任务准备资源并创建任务:
// 注释掉之前的动态任务句柄
//TaskHandle_t myTaskHandler;
// 定义自定义任务的栈数组,大小为128个字
StackType_t myTaskStack[128];
// 定义自定义任务的控制块
StaticTask_t myTaskTCB;
// 创建静态任务
// 参数1:任务函数 - myTask
// 参数2:任务名称 - "myTask"
// 参数3:任务栈大小 - 128个字
// 参数4:任务参数 - NULL(未使用)
// 参数5:任务优先级 - 2
// 参数6:任务栈数组 - myTaskStack
// 参数7:任务控制块 - &myTaskTCB
xTaskCreateStatic(myTask, "myTask", 128, NULL, 2, myTaskStack, &myTaskTCB);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
12. 编译并测试
编译并烧录程序,可以看到效果与上节课使用动态任务创建方式是一样的,都可以正常运行。
静态任务创建总结
-
内存管理优势:静态任务可以避免内存碎片和动态内存分配失败的风险,特别适合资源受限的嵌入式系统。
-
配置要点:
- 启用宏定义:
configSUPPORT_STATIC_ALLOCATION=1
- 实现必要的接口函数:
vApplicationGetIdleTaskMemory
- 为任务准备静态内存:任务栈和任务控制块
- 启用宏定义:
-
使用场景:
- 关键任务和长期运行的核心任务
- 对实时性要求高的应用
- 内存资源受限的系统
-
代码可维护性:静态任务的内存分配更加直观,便于调试和维护,但需要开发者手动管理内存。
通过本教程,我们学习了如何在STM32平台上创建FreeRTOS静态任务,掌握了静态任务与动态任务的区别,以及如何根据实际需求选择合适的任务创建方式。
📢 推荐关注:如果您对嵌入式开发感兴趣,欢迎关注我的GitHub: Despacito0o/FreeRTOS,获取更多学习资源!
📝 作者说明:本文为原创内容,转载请注明出处。如有问题或建议,欢迎在评论区留言交流!
评论记录:
回复评论: