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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ! y( \. ?* ]( I  t: H; ]2 s% ^6 `
( r: n. @( Q% B4 n8 ~+ N
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
. S7 t7 b3 C; F; T#include <unistd.h>, N. N) x' s1 s* r( b0 V
#include <sys/mman.h>
8 l; m0 ~9 L) s+ i8 M" K- a/ V#include <sys/types.h>
" ]2 c% G, l. t0 Y% w" X#include <fcntl.h>
; N' I. u4 v  t' Y9 K3 E, g3 }% B6 _; t( V
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
) Y$ q6 C8 k0 `3 c" V8 l3 ^# w( w) @5 E; D2 n3 Y! V# [/ @5 \. }8 b
typedef struct( O6 ?( X5 W, Y' n$ N: x
{7 _2 d8 L; h4 b
        unsigned int a;$ c: v8 X2 @: X8 q" Q* O! l
        unsigned int b;
+ A/ N7 ]6 @4 H, L7 X" K; F        unsigned int packet_cout;) W& ~& Z" M4 k9 r+ I
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 j; e$ H; E4 |6 v; F
% r" _+ B3 Y$ n7 rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
/ }  J- J9 [% v5 W( n3 ?* Junsigned int count_copy = 0;
( K# l# F0 p) \5 F4 i8 {
3 t3 q  x. u6 Z' _+ G: a
' v) O% h9 e" T- E. k; E( hint main()- W( E3 O. W! k* A) w+ I
{1 K( j* V# M+ q: b5 M8 {
        pRX_MSG_PROTOCOL pshreRAM = NULL;
* ?/ v7 T( R" Y2 z9 g  v0 Y        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. w( N9 O. O# ?' `0 A$ `9 B
0 ]6 [3 B; ?& M" R* j2 T1 R( h        while(1)
/ `' E4 H$ l. X4 d0 t  v# j: J) W        {
, I  n$ B' z; r' j+ A7 N7 Z) W                read_MSG_buffer(pshreRAM);# Z: s) [3 ~- g( q, X
        }                # B4 q7 o  K1 b$ ?# I7 E+ A
}2 t1 S+ k1 |% I6 ~( e+ @  m7 C
8 y8 o7 W( j0 f% ?. o
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' d* c/ s; o& A5 m{
: k8 D! C; c) I' r6 k8 i7 ?; q        RX_MSG_PROTOCOL buf;- P' v% h1 o. |% ]% B9 J
        
1 h$ o& S/ Y6 r5 t  N9 J5 g        buf.a = pshreRAM->a;
( N+ w6 Z( S9 ^2 |* L        buf.b = pshreRAM->b;
6 Y1 Z. k) s# r' W        buf.packet_cout = pshreRAM->packet_cout;
, S; ~! }# b0 v/ L        
& g5 [- Z4 k$ J1 T* y        if(buf.packet_cout != count_copy)3 r9 E( n) D0 M
        {0 ^! D. ~. `, e9 ^" b3 I; o  _, {
                printf("a is %d\n", buf.a);( X( @* l* A+ f
                printf("b is %d\n", buf.b);
! ^7 U* y* E& ]1 F! ]                printf("count is %d\n", buf.packet_cout);% @9 I! s% \& S* j
                count_copy = buf.packet_cout;  m2 u8 o, `3 w7 i
        }
; y1 `' E# A2 Z! X3 O! D' R2 A: w5 j        else
$ d8 N  X* k9 w& L        {
' a4 w6 S" M0 G                printf("No effective message!");' N" I" h- Q5 }( u
        }
; h4 s+ _4 C% |9 Z+ v* p}* I; w' s7 z0 N3 e$ v

- a2 P3 r5 j' J% j
- C- z& h) }% ?4 w/ t8 r+ Z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。  X% @; K3 b, [; R4 F4 v
使用下面代码,对内存使用了mmap函数后:$ Y9 n5 T: w& a& G6 L2 ^) M
#include <stdio.h>% e, a. T) D/ h1 h
#include <unistd.h>9 @. j8 c5 n( `& w5 W" a
#include <sys/mman.h>
- S" o0 d0 `. T' N$ _#include <sys/types.h>
4 R) O! g0 c/ R2 I& X#include <fcntl.h>
1 j0 m8 V0 e: s. r* m& \
6 l' ^) W- ~; H) h& c: Q/ z#define SHAER_RAM_BASE_ADDR    (0x80000000)
: ?, \0 n" y3 O% x5 G2 o/ g* V* Q#define SHAER_RAM_SIZE         (0x20000)   
1 }, W# o4 I' l/ q, s0 Z' y
; i' Y. b& Q& k& Y& {4 A) ?- h7 ^typedef struct
& v0 g) s3 u4 ?* j' w3 \/ D{; W( n! L0 g, d9 F) L1 h
        unsigned int a;2 }+ x4 R5 X8 b3 T
        unsigned int b;+ [5 y( y$ T& p% b$ v9 B
        unsigned int packet_cout;
0 j# v8 ~6 I0 e  l  e$ i}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, M: h! P8 ?& \& ^% K- @/ I) z9 S' B" R7 S. P( k
void read_MSG_buffer(int *baseaddr);  o, D) i% @5 U2 W: v
unsigned int count_copy = 0;
7 |, `8 _- Z3 L
4 w* c0 Y$ K3 e" [" O- }7 @int main()
' g9 R6 Q' R5 M9 d/ b% b5 |- k{* M# j7 p/ Q. @0 x" Z* ^
        int fd;6 v! Z1 G  k  U9 h
        int *mem = NULL;# Z5 i1 R3 T/ X0 \3 x, P

! C* V; p, s- z  Z$ N# h- [8 r6 k        if((fd = open("/dev/mem", O_RDWR)) <0)
3 \* }2 P; B6 a        {) g1 x! l+ M9 o0 B- p0 |
                perror("open error");# V* j& w+ |: i$ n/ s+ @
                return -1;
& H- o) N( i1 U; ^: X* I9 |! b        }! m. ^. F) n4 Y9 K8 J
        
% j# V( b; k& i0 Y/ I+ G( d        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ T' F6 a# j' _
( x0 N0 v' \2 @7 B$ U        while(1)7 K$ @; g( x' T
        {
7 p! `% Z6 v8 ?& f( r6 @                read_MSG_buffer(mem);. `- V" _5 \( \) t4 v, x; ?
        }               
9 j# s, P, k" A1 b5 w! Y2 v7 Y# k}
; g4 S! b8 B4 e
" f, o4 A" Z; e% w6 ?void read_MSG_buffer(int *baseaddr)
" i5 |" ^( I7 o( h{
  Q# ?; l4 n# u; Z4 G        pRX_MSG_PROTOCOL pshreRAM = NULL;
* E5 v2 p9 |; t: q
! i6 p! s# n8 V! x2 m+ J. |% D! }+ ~        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;; j! k( }: N2 |& p$ s

. C( G6 [- N; _3 |2 X; ?        if(pshreRAM->packet_cout != count_copy)
! E% H3 R) `  n3 h1 h        {* Y% {1 a0 p2 p1 J
                printf("a is %d\n", pshreRAM->a);) l/ Z% [. l6 d
                printf("b is %d\n", pshreRAM->b);- o+ l' w) j" z* F2 o
                printf("count is %d\n", pshreRAM->packet_cout);) ~& E( s+ G" L2 [% L. V( t
                count_copy = pshreRAM->packet_cout;
1 ^/ H( \- W" }# s* w        }
9 Q" r- d! W2 v1 z& X        else$ K/ Z2 N) E! m7 o  C8 R  y  J& `
        {
, z6 W7 K- h+ S2 f4 o+ R2 v3 ]                printf("No effective message!\n");0 s0 h) Z* Y7 l+ V4 u
        }/ r: X) Z1 M7 j9 Z3 J' ]
}4 Y" d, b/ c# k/ Y2 n! y) Q
- }% j, {0 _7 E/ n# A$ d
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???$ p; X% x% v6 e0 W1 a3 y

, u. z" g& A9 U9 f) [0 m/ G* t) N8 y& J* ]9 u* p

. r  W) x/ s/ z- y# q2 v9 |% J+ m4 K3 l4 h7 M1 Y" f9 n3 {0 R/ i
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-1 22:30 , Processed in 0.053666 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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