OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 / m0 }' [5 |& L

% y9 X- t! T! N+ NOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>, K- i/ y# g0 {8 N4 F2 k1 v0 c
#include <unistd.h># v8 r. d/ ]# p7 q
#include <sys/mman.h>' x8 C% T2 d' I
#include <sys/types.h>
0 S! `* R- r2 ]. R" _' i0 U9 _#include <fcntl.h>, V! r2 z' m" ?) T- T3 F& E& ^
8 F. N( J2 |0 g. o7 V* h
#define SHAER_RAM_BASE_ADDR    (0x80000000)   . Y8 Z" D% a) [/ `0 x
8 k/ C& w! _  ^9 q) K" @( c
typedef struct% D4 i2 c& |9 D# r) A
{9 c" F8 k3 t# S# M9 A$ ]+ V
        unsigned int a;* G6 I) z1 D8 t  k* D
        unsigned int b;
8 O* \+ N: L" Z# m        unsigned int packet_cout;/ I/ m5 d/ b, @# D  _; z3 h5 J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 n1 E# W9 Z' |4 j$ E1 U! m& K  Q1 x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 T+ M/ i' T3 a% kunsigned int count_copy = 0;
( C$ q/ u0 R- B' g, U8 h$ _
/ p( H9 c+ Q0 @: f% g5 l/ ]- t* h9 E: q) D
int main()
; j; g- \( g( b* ]) [2 A. o4 j{% r) C8 a% b! |2 ~5 {
        pRX_MSG_PROTOCOL pshreRAM = NULL;. L3 Q7 s: z1 x, D  @7 C
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* _. b( o9 n% u; n# i) I9 W, k3 `9 E& O1 R
        while(1)
3 J, h3 Y  `# G        {8 n, F( j( R% d: I9 @' i# ~
                read_MSG_buffer(pshreRAM);3 t. U3 b# d. }& r* f8 n
        }                : k8 @! k1 i  d+ F" e% l9 m
}
* d( I! N3 N8 o$ h( n$ y* G2 B5 P9 ~; @! `
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# R. T4 a9 b5 S{
- M' y( q7 p8 ^  [$ @* @        RX_MSG_PROTOCOL buf;1 W6 {- B) S2 L: L$ C  a
        
3 z& u7 q/ @$ U        buf.a = pshreRAM->a;- m* v( Q; H$ F1 _5 b+ Z1 {4 Z" z
        buf.b = pshreRAM->b;
8 |' m, E* A, ~6 F        buf.packet_cout = pshreRAM->packet_cout;
- p8 w8 b0 i5 M* F7 y8 {/ y        
) I  R+ Z( u( R        if(buf.packet_cout != count_copy)
" I, b$ j) c, b3 r0 v9 C        {
3 {8 P* d  O+ O6 I                printf("a is %d\n", buf.a);' }6 R% U& S: l9 T
                printf("b is %d\n", buf.b);# N$ O' f' F) ~8 h, I1 H
                printf("count is %d\n", buf.packet_cout);5 N5 T; W$ N! w$ n( ^2 X/ v+ `* k
                count_copy = buf.packet_cout;1 I; v2 @3 B6 S6 y! [
        }
. p# F4 y% }5 V        else
0 w2 W2 s9 s8 E( g* _6 j        {
$ d" B  G5 i7 f0 S                printf("No effective message!");" L4 j, |. G# R" z: f! f
        }8 f# {; s' A' H& q- c
}& }% x/ a- Y6 j5 ^% }

, X5 f; N& i+ g( V  X! }( U$ A' \; a1 l  Q8 V  X/ Z; v
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 R; `" E, i2 J5 Q' x8 \) c8 V5 ~使用下面代码,对内存使用了mmap函数后:
# Y# J/ X; S% ]8 P( }#include <stdio.h>
- _1 D: k0 b* o& U6 @& V#include <unistd.h>: @; h0 `  c2 r
#include <sys/mman.h>
5 ^$ I! k$ M0 A3 A' Z#include <sys/types.h>
+ P4 H# g( B6 }& A" }+ b#include <fcntl.h>
2 g! h7 d" d5 F7 j: D% d' \' N
: \9 d# G% c) n8 m6 h1 b! |#define SHAER_RAM_BASE_ADDR    (0x80000000)  r! m; g8 U4 Z2 q
#define SHAER_RAM_SIZE         (0x20000)   0 h0 z0 ~/ @4 g, F7 l' J/ N

- n4 z( L: J9 N; J5 \8 [( d: Y* ~typedef struct
9 T7 t6 m+ d* g  N. {; Q8 r) B{+ V$ y' j( _7 G1 l6 j/ K) U2 `
        unsigned int a;- z* p; q. d1 o
        unsigned int b;
! B) \! P4 k3 f- P3 y1 y4 K        unsigned int packet_cout;% N' x+ Z3 M3 b: x$ `
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  B, Q& t# y5 t4 O8 r" J- c8 Q
0 O7 b! X. |: F9 F& E, J, z; O
void read_MSG_buffer(int *baseaddr);, N! I) l* b, U% I9 K
unsigned int count_copy = 0;# p! B4 R) w, b4 `4 {  q
' J, f( ?' e# s, Q4 S5 I( I% C/ v
int main(), \' T# P& c4 E) X
{
! ^% U. s. t/ a        int fd;
- m* H9 R; `; P        int *mem = NULL;
/ J4 P4 M3 I/ V' C9 ]7 E; s
" V# |- K: B& f& i        if((fd = open("/dev/mem", O_RDWR)) <0)
* b6 G& e$ v3 r1 h' g% D* m$ w        {
9 l* [2 b) m9 g5 y( X                perror("open error");
( ~: K& P* B6 B3 i( C* l" p$ d8 ]                return -1;
9 t9 h* I; W9 V: c0 r$ }        }6 L: N" U; i4 }+ ~9 P
          _1 [" J+ Q$ l  j/ L
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 d( Q- X% N* B  a. e$ N$ M% f  m3 e' w
        while(1)* p* |) Z9 j, I' F3 N
        {
) R3 q  i4 P+ B8 ], h' w8 q                read_MSG_buffer(mem);# r% w4 S( I6 f3 p2 ^: t
        }                " s. a) l5 g0 h0 u! w/ d
}; E( X3 ]+ \7 Y1 n6 }9 a
: D: B5 @# }* c2 d  J! @# d
void read_MSG_buffer(int *baseaddr)
0 _% i: p8 z  J* p) ?4 o' V{
' \7 s  l/ N5 N' q2 G        pRX_MSG_PROTOCOL pshreRAM = NULL;9 \$ f) R# J3 T7 \7 J

. {3 d( ^7 C) I# _8 i- z        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;, e" n! n1 G0 p) _- O( q

2 R3 ]  ^' B0 A0 {        if(pshreRAM->packet_cout != count_copy)
4 Y8 K+ x; i+ R3 `3 w        {
, p( R2 t7 z$ }3 c2 F) M; i                printf("a is %d\n", pshreRAM->a);
5 b% [' E) g: X3 O) H$ O& I- F  o' D                printf("b is %d\n", pshreRAM->b);
4 b" k, E; b5 m& A                printf("count is %d\n", pshreRAM->packet_cout);% J# c! f) [/ h4 V7 _4 O( H2 z
                count_copy = pshreRAM->packet_cout;
1 ]  {. ~. s0 E        }3 ~, B" H5 I" L# A' w8 }
        else
( D, Q3 o$ N5 j$ |' P        {( ^7 p/ Z+ d% A% j4 U6 b" \
                printf("No effective message!\n");% p5 K* Y% q4 G
        }
$ a3 y9 D/ w3 q  h}
$ \+ M: L" ?1 m
$ `/ L, J+ _2 D. P( b没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! f* {% D7 i, D: @1 U1 A4 w

* j& ]+ N! K9 W  z0 C3 {5 t
; I0 m5 u$ ?/ R8 U' T- B  J; K- ?4 J4 v: O. j* c7 q

' k; E' H) |2 b% v
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-18 15:06 , Processed in 0.039831 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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