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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
  q4 Z# d' Q; h3 q+ i" e8 K- L
  k1 L- j8 Q3 B% cOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
  R' @" Z7 L+ {; V, n#include <unistd.h>
" x5 l' X  X8 L- i1 w- o: t#include <sys/mman.h>' b9 Q2 O" _5 Y% h
#include <sys/types.h>
* C. c- J5 J, g#include <fcntl.h>9 O' a( o# D/ \2 G" w3 @1 a
- u7 Z7 r0 i4 |$ K/ I- c
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
( ]0 W4 s% _5 D2 ]. }; X3 I; d0 A4 h; t0 P
typedef struct. s8 e+ e) Z4 C0 W4 _+ q
{
  h+ H5 X5 t9 w( y+ N        unsigned int a;
( {1 F) D) Q, _# M4 u: i& Y        unsigned int b;
2 J8 S" r7 G& {# X: ~- @2 K        unsigned int packet_cout;% d* v: Q/ N; n4 W0 L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 c, k" b8 y( G0 a& a
6 o, ]! i6 J; B# I/ E+ ]6 w% k
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);, \# q1 _4 n7 ^  b4 h* T) h
unsigned int count_copy = 0;
0 j) s7 [/ Z! M4 r" v: e4 u* L1 t" M
7 z9 t; M4 J* m; q% H6 p- P8 y0 U% {: J! R: h4 [
int main()
: M+ e1 Z# J) `3 t8 Q8 T{2 V# R) d, Q5 h$ ]6 l
        pRX_MSG_PROTOCOL pshreRAM = NULL;  u, C3 d: \8 U9 E
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" X! `# V* W% i' N* f) ?# n4 B( @
        while(1)
" O0 z% h- u# N% n1 w        {
- {* K2 V, j0 P                read_MSG_buffer(pshreRAM);
# ^% }: k* p1 W) B- B: N: F        }                3 {! _$ A. o/ Q7 M( p  R
}
! O% T, A0 L6 S& V! j  Z& p; f; p# k1 h# U2 s) Q. H' e
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
% D2 N9 D4 h% G$ d/ C) K, e9 |9 ^{
4 I& c& T. E' B% }/ q        RX_MSG_PROTOCOL buf;1 h" ?6 h9 j: g2 L" i, N
        
, X. r4 ~% h7 s1 u2 n# S( A) m        buf.a = pshreRAM->a;0 m* ?3 \" D# ^* c, B
        buf.b = pshreRAM->b;
5 F: t" H& X# Z: }3 X        buf.packet_cout = pshreRAM->packet_cout;3 X) p) I% d& z$ y; E
        % Q# d! F4 g& y
        if(buf.packet_cout != count_copy)
! h0 K7 y7 q5 x. u        {
. O" j0 ~  u4 P. w7 H                printf("a is %d\n", buf.a);3 |: z9 E* a0 [: S4 O; v" U* _. I5 P
                printf("b is %d\n", buf.b);
& G1 [: N2 F, ?4 ^1 f* f5 {                printf("count is %d\n", buf.packet_cout);
# ?3 Z  i0 J6 D) t- P                count_copy = buf.packet_cout;
% a6 A: l6 s7 V$ Y% v4 g+ J; _5 i0 ?        }) M# P2 V+ ~* J
        else
' U% G5 C6 P, ?$ T( ?5 t        {2 K5 C6 t3 o  }. H" A  |, m
                printf("No effective message!");- }# {8 E; p/ n0 k$ w" D# Q
        }
6 f3 |# s! q- D" U. j/ P, v, ?" Q}/ ]" A, ]# C7 K. e2 K  Z- p

3 |! j( b# H1 Q3 i9 E: \4 G
5 ~8 l' @( c: `: M% U* N+ O% m$ [但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。3 I9 S9 l% [4 r' b
使用下面代码,对内存使用了mmap函数后:
' _4 a! g) p& R, c4 B#include <stdio.h>
; K, d8 L7 \& q" }3 e( N7 o; ]9 V#include <unistd.h>, z3 M) a6 x: Q" Y5 q* N+ S, G
#include <sys/mman.h>
4 p* C) q$ x( D+ m* J9 J#include <sys/types.h>
3 e2 I  i  f1 S# }! |3 w#include <fcntl.h>  S  p7 u1 c3 Q

- |! s" Z$ \' U. m7 p9 M/ K/ a9 J, B#define SHAER_RAM_BASE_ADDR    (0x80000000)
2 J) A8 G" X/ |$ y( R- \#define SHAER_RAM_SIZE         (0x20000)   
' K! u) E. @4 m% u+ m" J( ]& i
- _  w: Y: {3 T8 B( Ptypedef struct
4 }- t4 u2 a" U1 x{; l% v: r! M. Y/ E" K" |9 ?
        unsigned int a;
! V3 l! D6 b! V        unsigned int b;
+ _% K) t3 ?$ M& D- Y: n9 G        unsigned int packet_cout;
+ a; v& h; x% Y- s& f3 I6 B3 F}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& x1 D$ d+ v5 ]9 l. u3 F% I

" K$ U6 T: _. w: |' U! gvoid read_MSG_buffer(int *baseaddr);
8 V/ C( O, \4 w& Y+ sunsigned int count_copy = 0;% n3 S! D: H! r4 v$ I+ @' R

) p8 d( r: |' L% |9 A8 Uint main()
" S* M8 y' z9 b$ Y! j# F! g2 o8 S{1 U4 M4 w! X0 x7 Y+ R/ u. _7 U
        int fd;
' j! l  m. j0 d( x        int *mem = NULL;
6 F5 I: j% T% W! }$ ~
+ H( A* O. m; }( }0 ]# z4 t        if((fd = open("/dev/mem", O_RDWR)) <0)1 j3 E( x7 O) ^7 }' U
        {+ y: @( @$ \0 `- t  c
                perror("open error");
. _+ z9 S8 E" Z, }. N                return -1;* e: ?# M9 D3 ~* m  X& G) |& Z( c, O
        }( C) U  Q/ t" j5 J) I8 r2 y3 A1 W
        % }0 \9 v- T* Q2 A4 x. C5 W
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' x8 W4 Y' v/ v, k; h9 t7 Z! ?1 _" ^5 R
        while(1)8 ^3 \. r6 \* ~5 U
        {/ v' n* m+ Z& P: B4 _' ^, r0 Q7 W
                read_MSG_buffer(mem);
1 U- J- U6 Q* o" S9 u: B        }                . J/ ]0 f" n7 a' Z" P5 W
}4 a- b3 v" B* O4 r' N

8 A! v* ^( i# c1 p2 a4 F- E) mvoid read_MSG_buffer(int *baseaddr)
& E" i, s+ ~4 O( n$ n{% q; R; W7 x7 g. D3 H/ U
        pRX_MSG_PROTOCOL pshreRAM = NULL;. `' s( R) y  j; y7 \' v* v
6 i" N% V; G& H+ \
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;6 x- v$ H' H8 i
1 v9 g% W( s$ s  Q% |0 k
        if(pshreRAM->packet_cout != count_copy)' v. U% `1 U9 n1 m. n* Y) e
        {
  K9 M6 L8 s! t                printf("a is %d\n", pshreRAM->a);) }$ M0 R7 N# o! A2 s' T
                printf("b is %d\n", pshreRAM->b);, W& T1 w4 Y6 f. ^4 p1 e( o
                printf("count is %d\n", pshreRAM->packet_cout);
! S) z5 H6 x6 E/ q                count_copy = pshreRAM->packet_cout;2 V/ b7 L- I) F% T( `" \
        }. f3 K4 x; r2 b
        else3 [% _: u( p+ w, A
        {
0 Q7 e, d! O- {7 P2 }3 c  L                printf("No effective message!\n");' t% Q2 T! M/ [
        }
/ |1 [1 }3 E/ A2 l6 o* `}3 r4 T1 U/ f% h' H# u

% {8 u" L7 i* K/ O没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ D& m% X& S+ p1 F/ \2 o. t
0 R7 L* y2 E2 Z( p5 h" x
7 A" Q& E. [1 v9 w4 T* A
) P' Q$ n8 N" Z' o9 I# t" v! i" i4 T" I  E9 x, U  U
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-25 08:09 , Processed in 0.040820 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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