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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 0 h; d4 V' c( G3 P+ P8 a8 t: C
6 O* k0 l, s8 z4 k
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
8 O3 c9 P; W/ L% d' c8 ~#include <unistd.h>
9 C$ t6 m7 Y2 M  c#include <sys/mman.h>' M8 }6 P5 Z- z( D
#include <sys/types.h>
0 m  H. V: J2 x& X- k, L) N#include <fcntl.h>5 A0 k) ?: ?  Q& v# z) p  {. Y4 n
% r$ \& U4 V# n; G1 R
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
9 \, K. N7 ]2 |  ]1 g0 C& \) f7 o+ ]3 ^+ w, \, F
typedef struct
9 w& @( ^/ [: B6 c5 v{2 |- V9 H& u( f* S
        unsigned int a;
, d: l* T$ D, n+ `0 ]  u3 E: z        unsigned int b;  ~8 o9 P) i5 H4 x; u# m, P
        unsigned int packet_cout;& h& r0 u7 S; }* S; a! k+ {
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: u! N  a; E( x0 J: e6 `( n3 k

6 Q- w' R' T- o8 L* |void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 u- g3 T9 l' U) s1 uunsigned int count_copy = 0;
: |1 V! N+ y6 f( T
; d; X3 }/ r  I+ c( s: l* _7 x5 ^  V3 X% ]# t
int main()
6 J+ G& K+ m! P  O$ Y2 q{
; l( _% e8 q9 Z. W6 Z        pRX_MSG_PROTOCOL pshreRAM = NULL;: f8 d* j( v2 Z4 k$ Z% t1 h
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 l5 }( z3 R$ _- c9 G

; a2 g4 M- }: n! W# E2 T        while(1)5 }) b* G9 b% n) S8 E6 v& Z, P6 O
        {4 ]7 q+ V, ?2 _
                read_MSG_buffer(pshreRAM);
8 h( ?0 ~; L' Z+ r0 [        }                3 {. G) F7 P; p
}
/ a) N7 b. P- a7 @5 x/ c( q+ u; B0 g/ I& k, t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
% ]6 W. [  ?- T& v, `{0 @$ o4 @* s! o4 p9 F0 N
        RX_MSG_PROTOCOL buf;
5 _9 D: @5 \+ P' \/ b' y9 Q        
7 f  ~: d$ v- T4 F        buf.a = pshreRAM->a;. q5 C1 ^& |2 P  `7 V& D) Z
        buf.b = pshreRAM->b;
/ E# V9 C- e* S        buf.packet_cout = pshreRAM->packet_cout;8 e& p5 u. {- l1 A3 x: h0 B3 E
        
+ D) |! |- ^8 v        if(buf.packet_cout != count_copy)
& v! z+ d, F6 H$ q2 i. P2 q        {) r) s, r2 m* ]2 G8 b
                printf("a is %d\n", buf.a);
" |- F1 A- R% ]7 L                printf("b is %d\n", buf.b);6 @5 ~( [4 W$ J1 |) |
                printf("count is %d\n", buf.packet_cout);* f8 H% g) b5 U5 U
                count_copy = buf.packet_cout;
' `) H' N. R  {        }
0 H+ K3 O1 F7 C2 ~8 b9 {4 C8 z        else
4 g) I9 r3 }& G; z9 K, Y        {; B1 L- y: r4 ?( G! L) {
                printf("No effective message!");
2 O/ p/ O/ u3 z/ M% ?! f        }
3 }! g. Z5 h" i! q4 {, R. T}" z; R0 z& s3 k; R

1 P; F$ b1 H9 {& ^% F$ m
; A$ x* e/ V- B但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。( x8 w. Y' W9 h- e, s. E. D) H
使用下面代码,对内存使用了mmap函数后:% I& O) r' R, Y7 x  @3 B4 u# e' h
#include <stdio.h>: A+ ^) o% _7 m  D$ d3 |! v
#include <unistd.h>
# H% Y& W9 i0 F. a#include <sys/mman.h>
5 X6 f! v5 k$ z5 a6 M1 x, |2 }6 T#include <sys/types.h>
' M# k$ }" N* I# ]" K7 F#include <fcntl.h>
2 m  U) S! Z! a2 G& ]/ ]5 C- r, i+ W1 p" ~2 S2 f
#define SHAER_RAM_BASE_ADDR    (0x80000000)
$ I7 j- @( L% @6 J$ L4 f5 l! F#define SHAER_RAM_SIZE         (0x20000)   
/ C% x# {% T% B3 ~. y8 i( u
2 C' a, f4 i3 V: Ltypedef struct- J1 J) d" X8 W* C) W$ M
{1 v2 g  ~9 q; }
        unsigned int a;# C" }- Z" L9 q+ u( F
        unsigned int b;
6 a, n0 j) W7 }        unsigned int packet_cout;1 Z$ ~: V2 ]. k- H& d  U5 v) ]
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; x+ c4 Y7 q( f9 L% p$ n
4 b1 @- c: C+ w3 f
void read_MSG_buffer(int *baseaddr);
/ @" X+ v9 s3 c! x( f! runsigned int count_copy = 0;$ P8 o- c! J  }
3 f+ R1 Y" |2 b8 x" j
int main(): l8 c4 S$ P6 f9 p, F0 l* E
{! G, E* y8 @' _3 F6 g! h. S- q
        int fd;% j4 J/ f+ b& M) [1 Y$ B
        int *mem = NULL;/ R& R6 k& n6 [/ x. k. s1 i" X5 c( _7 S

# k7 P& j: z" D0 ^" j9 z        if((fd = open("/dev/mem", O_RDWR)) <0)* m4 _# K' I" B! j6 a. g
        {; v" x0 w" A0 Y
                perror("open error");& _4 U: N: f' r3 q  |
                return -1;
' `* i# ^% ]4 a. p* ~        }
+ L- s" w2 z2 n4 P        
# U# P7 ?: o5 O+ _; {+ W        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);. k' n+ h) L% S5 G# c

! g9 E1 W$ M2 w; n        while(1)
7 p) l6 ]. P2 d: N- r  G: y        {
! y: \0 H1 {, _1 p8 s7 Z                read_MSG_buffer(mem);
8 `3 [: Z5 h  ?7 [+ a4 A$ i& J/ c        }               
& [3 D- q3 A/ u* m}. V! a4 g8 G. s4 d
3 r& e% t; L6 k- L! _/ l
void read_MSG_buffer(int *baseaddr)
, r; o9 \" x+ [& n3 T/ @# ?{
8 J+ W4 e+ }, n9 ^! O5 z  I8 m        pRX_MSG_PROTOCOL pshreRAM = NULL;8 Q( X! R/ m( U
( F  p* F; L; f; [
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;( e+ ^0 W9 L, I& Q1 D
& \4 K, f7 }: l2 u' F0 V
        if(pshreRAM->packet_cout != count_copy)7 q* o5 m# s+ k) a8 a
        {1 ^: W- \, b& U; k! y) a' }+ Y
                printf("a is %d\n", pshreRAM->a);
% x- E( U1 B9 _2 i: l' C                printf("b is %d\n", pshreRAM->b);* k  L1 l6 m$ U3 U7 W
                printf("count is %d\n", pshreRAM->packet_cout);" o# a2 I# t4 d! P" }
                count_copy = pshreRAM->packet_cout;
& J; z5 m' Q# C% b1 j3 v& v4 T        }) x7 v+ E' ^( K( z% O
        else
) d7 ?2 c; t9 d7 D        {
; V% O. m0 K/ I                printf("No effective message!\n");8 W: T( R* f% Q8 X$ N, D. |7 J7 y
        }3 P: U* n/ C6 c1 X5 x
}3 g7 l" j+ j# G1 Z2 ?

/ T# Y" Q/ ?1 X( A2 Z7 ^: M4 t$ B& m没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
+ p$ L' Q; j' }+ G, h% H2 r9 s6 j' H) [  I
$ L& C  d9 d* K6 E1 }' o; ^- n

5 }; S  n2 K8 W. W4 X0 v
2 c4 g4 [8 s% @; J. f: ^6 M
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-10 10:00 , Processed in 0.039094 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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