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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, U, v5 ?' u2 _
, b& w& U$ u9 X$ r8 mOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ h0 r% M8 J, L4 {' X8 k#include <unistd.h>( m3 z: `& k9 K4 Z7 d, N" e
#include <sys/mman.h>
! a& w4 e0 W+ g3 @# n& N+ X: c#include <sys/types.h>5 D/ f) k: z5 j9 n0 p6 E' ]
#include <fcntl.h>$ _9 H8 b" a8 V* M# l9 O
5 W3 V# D5 M9 n/ R, ?* U( U1 }
#define SHAER_RAM_BASE_ADDR    (0x80000000)   & s8 B4 `0 T/ O9 c! Q9 f/ |" l
* L* k, s# w$ R: e) M: F. l' o, I6 V
typedef struct
/ O, B* l$ Q# R7 b{
) o6 v6 n' j5 ~7 J! J        unsigned int a;8 E( m) C% o2 b2 E1 M
        unsigned int b;& R# {& b: U# J2 a& E3 \. p
        unsigned int packet_cout;! ~1 f1 [/ i" h" M% O, U
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 m8 Q' W: O/ {

, W6 p  c" ]1 K5 j4 [$ {* qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);+ S! m8 Q" ~0 ]; f0 l
unsigned int count_copy = 0;
* P9 Y) G% I  v3 E" m  P, Z0 I4 Y; B7 O

# V9 `) I. m% V( v+ U# R+ q  Dint main()
$ h1 [, d2 p: h- l9 I: R4 y+ |{1 j( s  Z" G5 E" Q  @) i9 Y
        pRX_MSG_PROTOCOL pshreRAM = NULL;/ q2 g' Q) f: e5 G0 O9 F- B' E/ Y
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;7 U3 L! z8 m3 w* k4 A

7 f7 n; J, p6 D; c1 u& y5 P' s; J        while(1)
: ^+ \7 S8 R2 r3 C5 B% g$ J        {5 |" t+ ?% e: G+ w: `
                read_MSG_buffer(pshreRAM);
7 G: x) }* L3 V" P- @6 C        }               
) k% w% X2 Y1 H) I5 `$ I8 Q}
* J  U5 s& o# Y5 r0 V" s( n. P2 b5 Q5 K7 w( L0 ?& U: t( v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
1 c2 U0 {$ p) Q) d% g{3 Z/ a! _' |. w% j
        RX_MSG_PROTOCOL buf;
1 _3 ^/ z( b7 K8 A5 @6 X        5 V( ^, D3 [+ J$ Q* q$ q1 J' N- o
        buf.a = pshreRAM->a;
7 H. V. H6 V3 z( O% ^/ B. Q        buf.b = pshreRAM->b;
, m! X6 Q8 W$ D/ @        buf.packet_cout = pshreRAM->packet_cout;
4 s( d8 Z9 u' @5 d$ @' I9 S+ p! J! V        2 p& c* K& D+ R- d% j
        if(buf.packet_cout != count_copy)5 n1 h8 _9 ?% ?9 N; e6 Q
        {
) w6 c/ Z' H7 ]" u                printf("a is %d\n", buf.a);; |2 X; q- W* x, f0 {( u* A
                printf("b is %d\n", buf.b);. f# R6 p% t- ~# e
                printf("count is %d\n", buf.packet_cout);! X9 i. @$ ]+ N& P
                count_copy = buf.packet_cout;* E0 l4 m! x# q  I$ B1 A7 C, D+ S
        }
  G) z  b# s  g* B1 R. m        else
* i; u+ S- t$ t  J1 P: ~1 x        {* {. `% A2 a+ F0 F$ U$ O/ J
                printf("No effective message!");" A/ P2 t, A+ T* C4 u3 f7 |% s
        }: K: T6 |# W0 h9 y
}
* E7 d' W' a! S
& p/ e0 s' c+ h3 p: t% D
. z) T/ O$ Z# c& D但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。% n! A' P* y6 }) @) @
使用下面代码,对内存使用了mmap函数后:0 y! X8 O) r5 \' C1 Q; C
#include <stdio.h>
2 L4 [: |; s$ Q5 h8 ?- \#include <unistd.h>
6 f* O0 p6 @9 v#include <sys/mman.h>* _: U. Y* Q) r) o- }
#include <sys/types.h># {) E" p- Y' {: Q
#include <fcntl.h>
+ i. p9 K( L( x. Y: S
! \5 l3 x" S- Y) Y: i/ j#define SHAER_RAM_BASE_ADDR    (0x80000000)
. {( D- ^  _7 X0 e#define SHAER_RAM_SIZE         (0x20000)   ' C4 z  W5 z& m" }# S3 k% N7 Y; m

1 o8 O& @4 g  I' f; b+ [- J6 Ttypedef struct5 ?5 s( e" L+ ^
{
+ x1 w. \) I  ]. t; c7 m: \+ q- b        unsigned int a;
$ x- e0 Z4 T( n% j7 `        unsigned int b;
3 r; m; a, O& d; R' d7 B2 |+ b        unsigned int packet_cout;
) \( y6 J7 H! V' p/ x}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ c. @3 l3 X$ q# ^/ t$ g. |- E6 l/ g* F4 r9 V7 B
void read_MSG_buffer(int *baseaddr);  l% O+ G$ N! v: x
unsigned int count_copy = 0;
& Y% s1 u" O( N9 h7 M+ o
% c% S* U9 k: f7 W0 _int main()% `1 _7 y! I" A' Z& r3 z+ G9 o
{# d3 z: |, p8 v1 {
        int fd;; ]2 \/ i1 q  ~5 a, d
        int *mem = NULL;
$ l/ Y0 F/ P/ _2 K( ?! C+ ?, Z$ C7 y
        if((fd = open("/dev/mem", O_RDWR)) <0)
+ E& h$ c3 w1 ?3 D        {
) y( a* r! z) Z' k) |) z" s                perror("open error");
' _0 [+ B0 E* S9 S1 i/ }8 K0 Q& x                return -1;
+ ?/ U  t4 y, j3 u        }. O/ d9 H* A, F& H* s$ M/ p6 A
        
4 b" u4 t6 y+ v2 f. ~) g- q9 Y        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
! j  K4 y3 r' Q, d
* r' w* v' N! F) n  B. e        while(1)
* Q4 ^0 l  c2 _8 y( [0 H  s: |        {
! h# w) N) x7 T9 O                read_MSG_buffer(mem);$ `0 k1 d$ V; x% G8 C
        }                " v8 r; O1 H4 g6 p
}3 ^1 M6 \+ G* s0 D* Z

* ]! T3 N& j  h, K- ^void read_MSG_buffer(int *baseaddr)
; i6 w' R! ~2 R/ P; }{4 Q" `' `" i$ u9 I# Q1 k7 W7 E
        pRX_MSG_PROTOCOL pshreRAM = NULL;
: S, z" ]2 R( F/ L8 y* t% c9 f! P
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: I. x/ f  ]: C+ M# S
: ?; y& O6 Y/ r        if(pshreRAM->packet_cout != count_copy)4 U! l# n( m' I% `3 p; W
        {9 e/ x4 o0 ~) {" t9 w6 k" N5 H4 c3 p
                printf("a is %d\n", pshreRAM->a);7 ?8 @! O9 i" W5 O
                printf("b is %d\n", pshreRAM->b);
& w8 o; ^* K' H9 G+ F# J% i$ |& }' G                printf("count is %d\n", pshreRAM->packet_cout);8 W6 u) N5 X$ q9 S* F
                count_copy = pshreRAM->packet_cout;
  F4 k2 M# Q" v2 ^        }$ r5 M/ D4 C0 }+ l
        else) C9 w" D5 L, _5 `- y. w. E
        {
5 ?# }1 o4 R. O$ S( L3 h  ~                printf("No effective message!\n");
$ G0 j# g/ s* d& M7 j+ L        }7 r" d9 h, c6 G8 T) B* N
}1 }. i4 ?7 A$ A( C; n
2 |3 x' B  g, k5 s" B& g5 U8 ?( a
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
9 E  C" r5 Y$ G( `0 Y; u; u. O" W; I, e% R" M' k
- b' O( ^/ U6 I9 H

% S% H* Q6 |. D+ t0 U2 W, e6 ?9 |# ~$ O! N" k
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-30 20:26 , Processed in 0.041229 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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