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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & n* V- r! U# g+ S

9 E2 L( x/ F, ^5 ?9 ~; L  s  rOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>. L: `7 x# s2 b/ D  ?, U4 ]# T+ u  Z
#include <unistd.h>; V3 q; j' A9 I- h/ h
#include <sys/mman.h>9 n# D/ ~4 d( q; x( e
#include <sys/types.h>! T' A: y* `6 ^* w# s
#include <fcntl.h>
, D& w7 r9 T/ p
0 O' t2 h7 g( u- L2 |#define SHAER_RAM_BASE_ADDR    (0x80000000)   ! U* Y$ d- |6 z' y9 S& p
* B7 q2 L/ q3 b4 N. }' l
typedef struct
( e. S9 R* w4 X- I/ D! {{
* k  @$ z) Q# U' H% d# p        unsigned int a;3 T5 L: @# M) R/ k
        unsigned int b;; z/ m8 M  J, ^5 I
        unsigned int packet_cout;  c8 I; Q/ [" ~) h1 i2 m! I2 ^( i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: `5 ]# A  c2 e8 M: T, y* O9 Q
9 R; B  F# a5 d( }- O( a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);; }7 p* q+ [" Y  C# f* n7 }
unsigned int count_copy = 0;( ?- @2 Q: o1 O4 [( Y
, ]3 @; C. }1 r) S4 ^
# V1 i: d- w) W! G# F
int main()+ E! B3 {6 i' [! O2 P
{* Q1 f' J6 j: E  E+ V# R
        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 \, j' [1 S  K        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 i/ B7 d, P8 N  o' O2 w! x8 ^. U% g& o: y. Q) p
        while(1)
, A& m4 Q! M7 L/ n        {+ y0 k7 S" d0 v4 F6 E4 I
                read_MSG_buffer(pshreRAM);6 u5 J/ l0 w' U+ U, P8 J9 E
        }               
: E$ H2 Q8 h, d3 S}
6 l% _# V5 v: y; _& F" c' a( L5 x( I2 x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* B) o3 d# x! t& u$ V; s
{
! p! Z  q& X( u6 P) T        RX_MSG_PROTOCOL buf;
* P* A% ]* B  f& `        + _; m+ B4 g0 T) E
        buf.a = pshreRAM->a;/ H0 t  m8 {6 ?  X% Z
        buf.b = pshreRAM->b;
) V' Q: o* B* a0 G  c% n* X) T        buf.packet_cout = pshreRAM->packet_cout;
! |# s0 M5 I, I# D0 M% w6 V) N        
, O1 G& G4 k3 X/ C" Y4 r5 {/ I        if(buf.packet_cout != count_copy)
. w& \8 {5 O  S$ U# h        {! g; X: \1 k2 Z! P( K& Z
                printf("a is %d\n", buf.a);( W( |* N/ P/ w& l* j. P
                printf("b is %d\n", buf.b);
* X5 c! y5 J+ B3 l5 Z! b' F                printf("count is %d\n", buf.packet_cout);
% k- V8 p1 J  v) q8 F6 D                count_copy = buf.packet_cout;
7 I1 @$ x, S" o0 i- E$ e        }
/ c$ U: I7 ^; Z, v# g! L        else' x: y* I  f& Q$ d7 t
        {
$ ^7 \- Y8 y: K                printf("No effective message!");8 Y% _9 P5 h0 D3 e; L/ Y2 b
        }: X6 j' O% L. o3 f* G+ {9 w$ `
}
! H# Z* c& ]( m0 E9 V% R' n# g& ^- R5 \* K  i* D" v& j4 I
% H4 s( C# Z0 g5 O# |
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
  z+ I7 i5 t6 U, [# f, B8 X使用下面代码,对内存使用了mmap函数后:3 \3 [! D- O8 T6 v1 K3 U
#include <stdio.h>3 R) i0 q9 G* B
#include <unistd.h>
& m5 C4 B2 t( D7 Z#include <sys/mman.h>' ]. S6 ?. W2 ?* F
#include <sys/types.h>, b- ?+ K* f4 A
#include <fcntl.h>2 p9 u$ r# I2 o! [. |, m1 X

0 b+ b) r9 Y6 w. J) R3 a#define SHAER_RAM_BASE_ADDR    (0x80000000)+ {8 {' Q4 x- s6 F
#define SHAER_RAM_SIZE         (0x20000)   5 e8 m, B3 r- j3 j5 w

+ G6 @8 u% Z* f: ntypedef struct# j; x, D9 W, j& h$ ~
{7 @# t0 a1 V. k* Q
        unsigned int a;4 H3 `* i. t2 Q+ \& x
        unsigned int b;
) ~9 ]- K$ o) q* {! `9 T        unsigned int packet_cout;
. D9 F' d: @" u6 k}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 e  u& D0 \5 e8 }$ S) _( D  q9 O  k; T/ w! W, [% |( a% f- J3 G
void read_MSG_buffer(int *baseaddr);
! K4 ]& O8 n5 {unsigned int count_copy = 0;  f" G0 b! i0 l8 f; X5 \: k
+ ^. |. p6 c0 {: _) K/ V  c
int main()
* y/ q8 F, \0 K* ~{
% S+ ]8 s, a8 H7 Q        int fd;4 d& B& X: ^% B2 g$ a
        int *mem = NULL;
# q) u( g  }" z
! H" Y. }) s$ b6 Q        if((fd = open("/dev/mem", O_RDWR)) <0)
$ ^/ o  f* J; L        {! V7 \# I+ m1 q' l$ z9 N
                perror("open error");
8 B: u7 _* A: O8 ?4 ]                return -1;
, V+ }0 ^7 g, D6 q        }
6 A9 y; k& j5 u2 |; G9 r        
+ U# o' [/ O- w% B: p% W        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 K8 p' L+ x4 ^9 h3 H5 j7 W
" b1 {% v0 n$ D$ m  V        while(1)
/ x+ h1 n! o2 ]        {" j) i  @/ {+ }' H' o  ^3 n
                read_MSG_buffer(mem);# p5 |, Z+ m& _$ F2 r' |3 G; i8 l# @: ~
        }                ( e% y# M; w# e: |- w
}0 H7 `6 _4 a1 k/ E% j, `

( H# C7 B* ~5 C1 m* {2 W2 l5 Hvoid read_MSG_buffer(int *baseaddr)
% r2 M, L/ v; H. V{* R; M1 ^- g! i: c( c
        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 M+ t: Q; T2 y2 G; H8 B* B( b, c' d
& k+ B5 \* R( L. ~; E" A        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
% l- R5 G! B# R+ N% ^) J- K) D7 G, x' E) v& `
        if(pshreRAM->packet_cout != count_copy)  ?# W. _+ F1 @; u/ o
        {2 {7 s" W. {2 X) ]' l. L
                printf("a is %d\n", pshreRAM->a);3 ~2 R! n0 u! t3 B3 D+ V
                printf("b is %d\n", pshreRAM->b);+ o$ i* w" ~) Q0 P& r  f
                printf("count is %d\n", pshreRAM->packet_cout);
' Z! j8 O0 C+ \$ ]4 j                count_copy = pshreRAM->packet_cout;
1 w9 i: G7 P1 N8 @3 }$ _, z        }) E' p, y  i5 H3 P' y
        else
# }  @2 s# V0 j7 M8 i+ y- P/ t        {
. `0 v, |3 g2 N! u0 {1 T                printf("No effective message!\n");/ E( S' V1 X" m" `- Y  P- w3 @
        }& P) q6 [( a( W
}" l$ a' g3 p: Q- _& t- @

, y" _* [4 p% x+ r6 \8 n没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% r2 C' C& R, t  U* G6 D; B8 z" E) V. H) t3 p. X! ]$ i

- N% z2 Q& s8 K" V: ?2 C6 k. i
& i/ j6 \, `2 L+ w- d$ D
! N0 ?* K8 k7 }9 Z9 m
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-14 00:33 , Processed in 0.040771 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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