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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 2 _+ h4 C& b& k  `: `/ K

0 J0 A( t5 D7 s& oOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ y% ^8 F. b4 i9 Y& a/ a9 a#include <unistd.h>" D) \  p  q$ J8 D3 I$ {9 H
#include <sys/mman.h>+ L8 p, e7 w& \$ ?
#include <sys/types.h>3 d. d% S: t5 @( {, z9 b$ Q. |
#include <fcntl.h>
+ Y" v* r' _/ X& L
, g5 k! q! M! L$ Y1 P$ R, P#define SHAER_RAM_BASE_ADDR    (0x80000000)   
" }' C' ^- w: p& |8 v% x, o) X) W) y7 s' \
typedef struct, @8 r: v: v0 Y0 f
{7 W4 v; A9 @- Y: |
        unsigned int a;; J- }+ s# T5 O; g) P
        unsigned int b;
- }3 W/ E1 i& ^        unsigned int packet_cout;
$ v+ w5 \7 Q$ r/ _7 I8 ]}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 q$ Q- U6 g: B
( m. A4 n1 @' E
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);. K9 v; y/ u2 B5 a, H
unsigned int count_copy = 0;. h. G% |1 q' c
7 G2 S) K9 a5 L7 r9 R0 s7 m+ P6 ^
6 G4 P  j- `* R1 _
int main()
) B5 f( k  T  \5 P8 J; h( y# J{, A0 g2 l& q" U: o
        pRX_MSG_PROTOCOL pshreRAM = NULL;! S7 _% V) |0 z3 m0 m% d) P
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
) X# o; ^/ Q# r" R. c4 b9 V( t0 P* B1 T% S# c
        while(1)7 K1 S" ~4 G6 Y9 B0 J- E& G, `
        {3 `) }8 o& B& w; F, ?" J5 b
                read_MSG_buffer(pshreRAM);, \& L4 w, @: f9 m6 d5 ^3 O! K
        }                ) c& L/ J! @* g% T
}& J( T. g5 p  [# n" Y& a+ T/ i
: O' _: B1 x  r
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)2 i$ a  V4 j! o" ^9 p3 B. ^
{
* Z& Y* x# l( i# p9 ^% n/ I        RX_MSG_PROTOCOL buf;
0 X/ B* F- i  z0 T% N% r, C        
$ }3 m; F5 A$ i9 H* |2 d        buf.a = pshreRAM->a;: z0 D: f) c" Z+ L
        buf.b = pshreRAM->b;; a; g) l0 L- a  A) h
        buf.packet_cout = pshreRAM->packet_cout;  D' V3 F  I/ @0 O$ H' {& K
        2 |  G! K+ h5 D. v6 S
        if(buf.packet_cout != count_copy)" x: X3 G/ |9 t3 x* x
        {. U  j! A7 y3 M6 Y
                printf("a is %d\n", buf.a);
  L* J1 d8 k- i: E1 i2 ]) J/ R8 s' V                printf("b is %d\n", buf.b);" e4 }9 E. o8 @
                printf("count is %d\n", buf.packet_cout);
- s  [' I0 W  d- N- [  B- I                count_copy = buf.packet_cout;- c7 o( g- Z0 ~6 t: a$ V: U
        }
( S$ `% J  r- X0 Z% ^" l: |' N        else
( S% [. E' v' f5 a! D- T# c        {
# b% M& t6 m( M! c, s' [; C& X                printf("No effective message!");3 _4 V# O' ]/ p0 O0 {* O- z1 H
        }
3 E! C& @" k* A4 [" S}
9 G  x4 g5 j% e5 i: L
1 c4 ]/ |  ?1 q6 H# H- `$ p: C3 |' B) I, l# b) B3 |9 W4 S
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, \3 c3 z- l4 {2 y  j2 Q0 Z/ J使用下面代码,对内存使用了mmap函数后:
8 `7 H3 F7 F' g#include <stdio.h>
" k2 t+ }& d: r4 P% k#include <unistd.h>
, [3 v* f( {) M' c8 S4 H#include <sys/mman.h>  N$ B# P2 u  k( B9 ?3 Y7 W
#include <sys/types.h>7 f# ?( ?+ g, v' }0 b
#include <fcntl.h>
: T. ]- z  u% ?; Q
/ f# Z( Q& l0 L6 S+ }#define SHAER_RAM_BASE_ADDR    (0x80000000)- \% D! C% S; U& v
#define SHAER_RAM_SIZE         (0x20000)   
5 B4 @% @3 U6 n+ Z3 p( K* p7 j) H! R8 q9 p. b
typedef struct- `0 t! D- w4 _( m  k. G6 R9 b
{
1 E. a0 K: b9 j2 `        unsigned int a;
' T4 e  ]' a4 |2 y1 A4 ?) ^$ f/ _        unsigned int b;
  }! R, w4 \" t4 f        unsigned int packet_cout;
# @5 I9 _+ A- ?" s4 a}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 b% G- C' m, F  Q/ b
" W# g! V5 e/ |; o. ^1 m/ ?8 k: a9 mvoid read_MSG_buffer(int *baseaddr);4 _& y' A# W% y9 t$ |" I% }
unsigned int count_copy = 0;
0 K  T5 w! H3 S) c/ y( f
# g9 U+ j0 u, q; ]8 m7 w# nint main()6 A- M' O7 ]3 [0 J- l% `* }/ Z
{
! y4 e. D) c& C2 Y! a$ [        int fd;( U, w1 U: K- T) c4 c/ h8 o
        int *mem = NULL;
, c$ ~7 ^4 ~  ~0 A- I7 [0 v! {7 P7 Q) C- n
        if((fd = open("/dev/mem", O_RDWR)) <0)- W; v) y" }( l0 r
        {+ g1 R# ^: ^; H* P3 j6 O
                perror("open error");
# l; O0 N% X6 f; f* }                return -1;
2 {/ i1 l* b1 g9 I        }
! Y6 c5 w2 k% ]/ c        
0 N1 O2 {7 Q' v" N/ a2 t" N; C' e        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 ^0 \8 N. w& S2 [* F) r
* w* \8 |7 b; ?* U# U& s6 U  o! _        while(1)8 h* p- n+ J7 u( l0 J$ M
        {
* @. [6 y/ l* {5 O* ~; @                read_MSG_buffer(mem);! H5 V. b8 `  R  d" z9 K( k
        }               
8 P0 X! X4 E* ^' n& @* G4 v}7 V& a6 U- C, C* t
2 m1 l, L# z" V! {4 L2 S4 I
void read_MSG_buffer(int *baseaddr)
; N% h$ B5 P' i  v8 N8 f4 F$ ^. l{
- |& M. o" X; u        pRX_MSG_PROTOCOL pshreRAM = NULL;; u) k1 L7 S# h# w9 O% N
( H/ |1 _; t7 ?0 i2 c( a7 z
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" T' ~; e' G4 Y2 H) T( n6 s! `2 V1 @. h
        if(pshreRAM->packet_cout != count_copy)  j+ e# N" X1 z4 W& D8 f3 p* A  x
        {
$ ?: B# D; i: m4 Y                printf("a is %d\n", pshreRAM->a);2 u: @; K  B$ \6 U" z- P5 ^/ t# N# N
                printf("b is %d\n", pshreRAM->b);6 u2 I5 i/ X( E8 o: o$ u
                printf("count is %d\n", pshreRAM->packet_cout);$ [: U" R0 @9 J9 k; U  O0 G$ f
                count_copy = pshreRAM->packet_cout;
! y0 f# l+ j2 {        }
- P( V! S% D; W8 |% ~        else* O  b+ A" n. j, L# Y
        {
. p. |1 J9 U! f                printf("No effective message!\n");% T" O  \- S( P& v  J- i
        }
! z( k/ O/ m6 J+ x+ x" {5 n5 k8 v}
- I; U9 w; j- U% |4 w9 n" I0 F) z# u: d+ K0 y& S
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???/ d% e5 t  P' f% k: j- s
) X; L4 A- u  A; \1 k& F  J& f

5 `% n7 i, ]' l- h  i' \* v" b' P& O* I7 z' F
1 u% F7 f% v: n; a. P
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-7 16:15 , Processed in 0.037148 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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