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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ( S$ O3 W6 n! E8 D) k& j/ m/ h( ~
7 I+ o2 d8 w/ B3 v8 u
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>% f" a9 J/ x+ P7 o9 S
#include <unistd.h>
# F- s1 O( \% p% M% v( Z#include <sys/mman.h>9 N. \2 h: T. I, B2 K4 K+ x( V+ Q
#include <sys/types.h>
# y# K" m" a: Y7 J#include <fcntl.h>
3 S7 m( D( w/ a" ]* ?& L: U
: J4 c; m* @5 u- j9 ]#define SHAER_RAM_BASE_ADDR    (0x80000000)   7 h" a# o3 G! I4 ]) N1 h

# C( H/ x* G2 V0 H0 l# Qtypedef struct
. @. E( m4 a& M. v, k{9 X3 ^- V8 b8 g% S
        unsigned int a;. m5 O- p& f- t+ c0 t' w
        unsigned int b;
% R  K/ G3 B" B; u3 }. p1 ?0 t        unsigned int packet_cout;
7 T: H0 [, S, e. b}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 }$ z5 o* {5 e

- ^: o" h; U! Qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);! m: |/ c: @+ K# z
unsigned int count_copy = 0;3 z6 F+ m7 s" W9 f: H
: z6 b$ |% i' m/ f: [; Q
8 s$ q$ i# D$ h$ ?# Z
int main()
$ W3 {& J9 z/ G' P8 w{
2 p6 a( ]1 w4 m8 M        pRX_MSG_PROTOCOL pshreRAM = NULL;
8 s1 v& b" F2 H. m* A- L        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
3 Q+ @* X" p. K# w! f
4 R3 ~; ?* ?, z7 f8 i$ k( H        while(1)5 r, K, V" r9 L( d1 u/ j/ c+ d. s
        {
: ?7 H& r. h/ Z7 l1 _7 E                read_MSG_buffer(pshreRAM);
% Q- X% I$ t9 {1 S* Q  @        }               
7 Y5 W' n3 i3 i# a# L! b! x) \}
9 e! w% a/ [% h. I% f" h8 ^4 p: y# a4 E- q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)  E5 ]+ Q- u: s
{
4 o& K" i9 O8 ]% O  w+ g* H! R9 Q        RX_MSG_PROTOCOL buf;' `' b2 N$ V" \2 C
        ; B. ^* F# T$ ^2 p
        buf.a = pshreRAM->a;
4 Y) ~' {* ^4 y$ V& X( V) n        buf.b = pshreRAM->b;
0 L. m9 K: B! ?2 [% J, [, `/ t: v        buf.packet_cout = pshreRAM->packet_cout;
: P& `/ }( n7 [7 y        
( i8 }& f% B) {; e+ Y9 n: J2 X" P        if(buf.packet_cout != count_copy)* y9 `+ t+ w/ d$ r0 G
        {
  c4 f) ^$ z9 j* r                printf("a is %d\n", buf.a);
$ m( g; S7 z6 T& H: v                printf("b is %d\n", buf.b);( V, N' A& k2 ^6 a$ l1 K
                printf("count is %d\n", buf.packet_cout);
, U# q; j5 t8 y                count_copy = buf.packet_cout;
0 P0 R7 k6 Y- E( M6 P& N7 Q        }# o7 ?% O/ V5 K8 s9 J- F+ _: ^$ _; L; y
        else
$ s8 ]7 B' A. {! K4 Y$ F        {
8 M9 k4 W* B5 {, q$ b) c# V$ U                printf("No effective message!");
: q$ g& V/ L# |% o+ m, R        }: o8 R5 M" ]/ x
}" U" A' X) }) S0 A
( l8 I: |3 x- }, i8 k
" O4 y: H$ y3 N0 A/ j
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* ^& f+ M! q9 J" h) c使用下面代码,对内存使用了mmap函数后:7 j  Y, R- P4 y4 Z7 N9 F. a  {" ^
#include <stdio.h>  v* Z& I- M9 v' C$ S: ?
#include <unistd.h>3 ?% C  x& l7 a4 Z7 ?) F9 y: \
#include <sys/mman.h>8 K, e* D; V9 \5 K: Z! C1 c
#include <sys/types.h>
3 X8 O8 \, G0 d, r( B7 r#include <fcntl.h>! x: j; H' Q, G9 w3 N

; e8 S5 f! [& v% B#define SHAER_RAM_BASE_ADDR    (0x80000000)8 h0 u  B, p& ~1 j. V% Z: c9 i
#define SHAER_RAM_SIZE         (0x20000)   % M$ ~' `2 o3 [

1 O' O1 G# l8 X) `) Ttypedef struct, ?2 b( u+ h( J6 s0 Q+ m
{
' }1 W8 |0 M6 @! f8 B        unsigned int a;
$ X1 e% Z4 J, m* D        unsigned int b;" i, i3 z  j: R8 l
        unsigned int packet_cout;
1 m# \( `4 o3 Y) Y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ T! X/ t/ t+ D8 |4 Q. ^8 e
# L  y% B! }0 g3 ^
void read_MSG_buffer(int *baseaddr);
( q1 `* U! v& wunsigned int count_copy = 0;6 I% R% F$ U% h+ p, L+ C

% M' `9 B( r6 Y( \. Dint main()
" W- h: U6 U( y) ?& }{
* v) `+ n. w. y8 Z: h        int fd;' ?" W4 W! a5 j, B) s
        int *mem = NULL;
8 x) ?3 z+ R" |. q/ ?% a3 A; o& M! ]  P( t  e4 X
        if((fd = open("/dev/mem", O_RDWR)) <0)" P, N3 o# ~6 N9 w  X% n0 R; }
        {! |5 k3 I3 `2 ~! [3 j: U# {/ d
                perror("open error");; v: h- \" ^) v9 V
                return -1;) O- a2 f* n) V- F. A3 n0 S
        }9 y5 B; h4 K9 ~/ B6 T+ [# J3 B
        2 ?+ f; k8 |; T+ g, e5 ?( L8 i% U9 c
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. ?  Z; w  e( W# L/ |+ h0 W8 j: M" y  y1 l* [) `
        while(1)( ~8 E& O5 [! L7 _
        {
* q7 G4 y. ^5 X                read_MSG_buffer(mem);
; `$ W9 e1 W# M% z' W* s- D* h. F        }                4 x" e  }$ ^& P5 ]0 }$ o( p
}
5 C+ s: u$ X6 U4 q: m( N5 K
+ W! z( g3 Z% `, f1 }void read_MSG_buffer(int *baseaddr)6 N8 `& N) v+ x. ?
{
0 ]; Q, r, Z! Z        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 W, d# I0 h8 V  ?& E4 R
8 J' s: o2 I  M, n7 a8 L        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
  k% @- h( M: Y9 e
6 Q- H0 E$ i% ^% p4 Z0 m& V        if(pshreRAM->packet_cout != count_copy)' |4 M; r) Y$ U. }
        {
; I3 i0 J+ v1 U! @( Z( g0 r                printf("a is %d\n", pshreRAM->a);
7 |3 F6 [  [3 S+ v+ t                printf("b is %d\n", pshreRAM->b);2 m/ A2 v0 n/ G4 x
                printf("count is %d\n", pshreRAM->packet_cout);3 q# L( l. z, c
                count_copy = pshreRAM->packet_cout;; J  V+ s' E  I! O: @& t
        }
! T5 }$ V$ @) T) u        else
3 A! ]7 D- t% V8 a" ~. M. \* z        {
# q* U2 |2 g3 q/ }; b( C                printf("No effective message!\n");
% U& _4 w  }1 z) C' q% L        }
, Q- F0 {  l# q" A}
+ X8 `  {5 S0 F! P  ]" ?
2 g. s$ J% M! j$ [没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???9 b% N9 O, t' L% f5 L

' {0 N3 g" Q& m, x' A, E# K# r3 V2 a6 f! V8 ^
% K) }& K+ y7 U7 H3 }# N
! T- r2 q, g; g  p* o
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-31 23:08 , Processed in 0.041394 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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