OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5778|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& J4 i5 w* ?! y  A0 ~/ m2 l$ J
/ `, L9 k. M/ S; V! b9 t( ?) ^  K5 JOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ \- d; F: a: h' @. x#include <unistd.h>
# v# d# K. h3 W, R#include <sys/mman.h>! i5 A4 L; \/ F. m2 Z% a: g3 K6 N
#include <sys/types.h>
7 V$ q4 L4 i- A8 O& G- }. x#include <fcntl.h>. G" C, a* d+ a; V" D

* H% f9 W. ~" z#define SHAER_RAM_BASE_ADDR    (0x80000000)   
. C7 m  H) Q- h* b* Q# B: X7 x4 m4 k/ `8 h: t+ B2 c
typedef struct8 T1 [3 a5 g# t5 g5 H1 ?
{
. |" k2 B! ~' ?5 ~* P; ?. u        unsigned int a;
) C# M1 F0 r' G/ }$ O9 t& t3 Y  g        unsigned int b;9 n) K# D. L( d$ G. X, H3 Z
        unsigned int packet_cout;
/ g( ~$ ]" m3 T' `2 ?: M! q$ k}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 w: F) H, w2 p- @+ W+ D) K+ t
' Q' N9 t9 P& C$ Mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 }2 h4 r: O2 o9 {, h/ k* {
unsigned int count_copy = 0;
) g* k* b0 F# F
# Q, a& _3 A$ [1 a3 b8 O- v9 V1 v: R9 ~$ [) J$ |2 F2 i
int main()% _% r- @  P" d! ~9 {
{
4 e0 x2 n- \- T        pRX_MSG_PROTOCOL pshreRAM = NULL;  N: S. l' Q- P; H
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;9 _6 E' M+ L2 D, @! K: [- q
$ S1 X/ V" r" z7 [
        while(1)& Z. j$ C  |7 d6 H4 X6 I% ?
        {
% _1 @& C/ h& u. T) O/ {                read_MSG_buffer(pshreRAM);
2 T2 l% e: u" g  o0 P9 h$ S        }               
+ g8 K; B7 a) C0 [) m}
- }" P! U4 C" v( P& e+ R2 I/ k2 \% Y8 \2 F% n  \- U* F3 d/ \4 z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)/ E: _: P* m8 }7 a% h
{
  ?! e5 v' t' p3 r/ D' ^        RX_MSG_PROTOCOL buf;1 x, [* Z2 ]0 y, A* `5 |
        
* i  {# r) b/ w( r7 Q        buf.a = pshreRAM->a;' ~0 ?' h% f/ v/ {& c
        buf.b = pshreRAM->b;
+ @8 V  X0 e% l1 l# J        buf.packet_cout = pshreRAM->packet_cout;5 D6 S$ L: f/ V+ N) X  u2 R% L; U
        
+ p5 x8 U/ |2 l2 e        if(buf.packet_cout != count_copy)
0 s0 a( X7 ~5 u" W* @: h        {
: @) ~# y) L5 |& g3 E0 G6 \* _                printf("a is %d\n", buf.a);& ?. D7 E  r4 B* w3 e0 ]# K
                printf("b is %d\n", buf.b);8 I: {3 D/ B0 x" m6 V' ~5 W. k
                printf("count is %d\n", buf.packet_cout);
% u& s3 |5 o1 D: [" d1 c                count_copy = buf.packet_cout;
3 A* O) {  w# Z- q  \- Z        }
( U0 |9 i, |( H& r% O9 q        else
( M+ p) u8 y2 ~2 Z        {. o' ?, z3 f/ E- y4 [1 k4 Z2 j
                printf("No effective message!");3 K, B3 g4 m% f. L2 q
        }
2 G  Z4 I. j6 ~$ x+ M8 F}" L6 d7 s# J% U7 |& {: y, Y+ R
* T0 T4 @! }' l) d& p

% O3 G. T& A- b# n  ~* `但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。; ~7 }% m7 {- H/ d/ @7 a% E8 \9 {
使用下面代码,对内存使用了mmap函数后:) Q% Q& ?% t/ T+ D
#include <stdio.h>6 c& T. I' [0 V
#include <unistd.h>0 I6 `: M+ Y$ Q- X- C, t2 W2 j- ?
#include <sys/mman.h>
2 b+ {  w) @) i0 O' K0 T#include <sys/types.h>
. E# F  r$ H% n, j. H$ `+ a#include <fcntl.h>9 A9 q+ l) C6 G

$ m" m4 W' e! y8 L$ V#define SHAER_RAM_BASE_ADDR    (0x80000000)' \, V: F( V- Y4 ^
#define SHAER_RAM_SIZE         (0x20000)   
1 J4 |2 m6 d- V9 [0 O
7 k# m: l$ Y$ E/ U# w1 ytypedef struct8 C+ l5 F/ M; G7 _0 X
{
  x: k+ I' e; ?+ {2 U% y7 z        unsigned int a;! [: M( P0 I' p0 E6 I- w0 J
        unsigned int b;# B) V* a( ?  W
        unsigned int packet_cout;- b) o2 E. \1 j3 w/ H+ U. a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ K6 Z6 e8 U' q6 _) l
6 `1 _* o) \% Z* Z* U' K; N1 U( Nvoid read_MSG_buffer(int *baseaddr);% A# o' U/ O$ B0 O0 H( F" u
unsigned int count_copy = 0;! H- Q# `$ c6 ~0 _

9 O0 R; S1 Q6 v' ]/ r5 yint main()
* i6 E# i7 P3 G{
- C4 ~+ J& M5 i" w: ]# O: X        int fd;- C( y& }. a0 ?3 z3 h0 _
        int *mem = NULL;! H: R4 G' s# L+ i3 [
3 {5 ~4 w  z$ c8 X% }( {8 L' t5 T
        if((fd = open("/dev/mem", O_RDWR)) <0)
6 {: }% d, i4 \# n  `/ P: \        {  F4 d2 z" L; K1 L; N6 R: D
                perror("open error");' g* W% x5 t1 R2 |
                return -1;
1 V9 o9 W/ t' Q: ]! n1 f* ]        }
: C% y$ ]" Z- b' j) o: ?3 q' X        
. R3 m; V% o2 ~, R' e; L' Z$ r0 f        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: G/ \* @3 L# n& n5 V  X( D  L% m2 E5 z( j8 I
        while(1); o5 ~) _# l- z* O0 Y
        {7 ]+ R3 `5 |8 T( A
                read_MSG_buffer(mem);$ h5 w  `1 G' G+ u, J# `
        }                9 v( L1 v7 @! x
}% v5 d  s0 J0 w& e, B: a

% e* c: k8 \  ^. ^" P4 Fvoid read_MSG_buffer(int *baseaddr)
/ K* V! Y$ b. q3 f{
' b; F$ c2 f& |6 S        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 ]$ h" \, [$ ^$ I+ w; y3 @' \) p
* C3 P/ t. ?" k) S5 c        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;. @6 @1 b. G6 y* p; C7 j( e
, j# Z' Y0 A& H4 @+ U( H/ r
        if(pshreRAM->packet_cout != count_copy)
% z: O, F3 p% R: ~        {% o1 u5 D; x' _. [% v
                printf("a is %d\n", pshreRAM->a);
: F+ h7 b7 c4 g$ Z" i                printf("b is %d\n", pshreRAM->b);3 Y2 q' G" Y/ N1 L4 S
                printf("count is %d\n", pshreRAM->packet_cout);- g# y  s8 d1 o! n* y# X; R
                count_copy = pshreRAM->packet_cout;) v5 i1 b) j2 g! i
        }
) H: B% `4 z0 T2 y/ l        else" E, I: `5 ]( k1 T3 Q9 X4 [# E. ]
        {
6 J$ @% ]0 s7 i9 p/ W                printf("No effective message!\n");
) q0 d- n) Y6 x/ ^- A& ?: K( K* b1 f        }
: e$ R" Q, f- Y  Q}  b/ y- D8 ^# w& s: z
! w) |9 S3 X3 W& [$ j$ ~
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???. p( D, c  `. h0 M

) k% U3 Y4 s2 A8 l# [$ G; ?
" v" v" t; y- E' J' V. A. P# i6 Z/ {& a

6 k. z/ ~- }; |" Y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

点击跳转“创龙科技服务通”

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2026-2-23 09:38 , Processed in 0.050784 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表