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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 K5 l* b2 m  F! x& f. ]8 L. K! t9 ?5 w2 S* `
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% q7 {$ i$ M& T#include <unistd.h>
; r  ]0 L3 v8 N- f" B; A# Q; l#include <sys/mman.h>( z  q1 Z5 z) ?3 [. \4 j+ O$ U9 ]
#include <sys/types.h>7 x0 X2 p# \9 d8 I: B+ C  c0 z: S
#include <fcntl.h>
* Z6 f# A+ O4 P
3 O- }* N$ J( u2 S# a3 c+ F#define SHAER_RAM_BASE_ADDR    (0x80000000)   ) c# S' }7 Z, ~4 }/ j1 a0 u

/ o( ~4 G+ w9 ~typedef struct
1 C: @9 z' J, w. S1 k5 f0 k# b{
6 n5 }' w2 e) w) l. s, ?        unsigned int a;
# o" K( L' |- ~: w; {        unsigned int b;
8 R0 I; k; g9 {! a        unsigned int packet_cout;
1 D( g! V7 @6 K& R8 U2 V9 c}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) I+ `; y% t) V1 L5 b% k
  T3 d9 s4 q2 A0 [1 ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);3 X. p. J, P0 ?
unsigned int count_copy = 0;* \, ]0 r# Y: V5 ^8 P2 y, I) G6 H: K

# ~2 Y6 z8 B& P
9 u: E5 R  S# [4 I9 E1 Dint main()
# C6 [' U; ^: i9 B{
; N+ ~7 N9 O3 T! N; Z/ A* R        pRX_MSG_PROTOCOL pshreRAM = NULL;" v9 A3 [$ a6 s- J" W) P* l
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 `. D# j# Z# Z# }. S; t/ p2 g
) W/ Q2 Q# e# P* {        while(1)5 p  D$ `9 }& ]% x
        {
" C4 I( W  F4 X4 ]" _0 D- Z                read_MSG_buffer(pshreRAM);% ?& Z3 m% |7 e
        }                4 ]. [" K2 t4 H0 U" N2 _$ h/ I
}6 F8 I/ n" o' c& t+ Z
: C! ?* u0 U  J, h, w4 ?/ t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, ~3 }# j7 D! _{& E$ i) L1 v& u" C3 s
        RX_MSG_PROTOCOL buf;1 y% C1 U  D* _. z: {9 B
        . u! _6 w! P+ p0 P, |4 m
        buf.a = pshreRAM->a;5 Y) M( u3 [7 I6 N2 v
        buf.b = pshreRAM->b;
5 O8 W( ]2 F* Y8 Z: ?% H5 s* S        buf.packet_cout = pshreRAM->packet_cout;
1 |& B$ C9 N5 U: {        7 X# s5 ]. \- `0 A4 R# J
        if(buf.packet_cout != count_copy)( d' U0 G# p" u  W" X$ y
        {
- @5 }9 I3 A, @9 q7 K                printf("a is %d\n", buf.a);
  A: _$ d- e( n) U/ {0 H+ h                printf("b is %d\n", buf.b);$ p0 K7 T! X4 j; @
                printf("count is %d\n", buf.packet_cout);( ]; u' K3 x" s0 S! \
                count_copy = buf.packet_cout;
( P5 @( \  H! D. x" J- P: ~        }5 p# j4 M; J5 T% e
        else
$ c. E9 |5 z, v' F& n        {* D0 N8 E- ?/ s- ~6 s6 c& w
                printf("No effective message!");) P9 h) k% x3 n1 a& s; p1 c
        }7 S/ @" l3 i; y  `  [
}" ~6 g" L9 e, v7 y! h5 c
$ H1 }6 C# H, ?4 }: K; Y! h- l: v& W
" L" p( B# O6 G* K8 V0 S0 K( ~
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。3 h% ~- K- O3 ]3 {" J
使用下面代码,对内存使用了mmap函数后:: Y6 r) d3 Y) C1 N! v; M6 G
#include <stdio.h>
. Z* O- Y* ?( O' x  w! a2 A#include <unistd.h>
3 t& z% k/ F* W# _+ e#include <sys/mman.h>1 x% z* K) s7 V
#include <sys/types.h>! T6 K9 B  j& N7 r
#include <fcntl.h>
7 E& r1 W9 x+ N" _; v$ F$ j4 e2 w7 X' _2 I+ J# `( G* p
#define SHAER_RAM_BASE_ADDR    (0x80000000). `9 u) I+ g7 V% |1 z
#define SHAER_RAM_SIZE         (0x20000)   
1 `' {! s1 d, O1 {: a, c: m
. l4 @2 S; x% z8 ytypedef struct
! l4 Z; \& u1 r% O- `: {0 o{
3 }" N7 y' M  g        unsigned int a;0 u1 w3 Z( ~$ @( N) |/ E
        unsigned int b;& I5 V) ]8 b0 n0 s1 Q
        unsigned int packet_cout;
$ R9 `* R5 ^5 n0 P. {1 q* K) j}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ ]3 u) K- f9 {7 r% G0 n
9 O7 f0 l' R. P1 h% ?" N
void read_MSG_buffer(int *baseaddr);1 u% {) D8 k  y
unsigned int count_copy = 0;' s& B, w5 N: a3 o4 w( v  h
5 `( H' }) M. z4 {; m; B! W  P
int main()
" d# S1 h. e3 k. w0 Q0 o{2 V8 S  {- _: D% }
        int fd;! k/ I7 F8 G! f9 a6 [7 r
        int *mem = NULL;
/ w- Z3 b. z; N6 R+ g2 e3 O) y5 ^8 t, \: V9 L0 K" k
        if((fd = open("/dev/mem", O_RDWR)) <0)
& V! o  Y2 ~. @1 K+ I  O        {* `1 N$ s7 c6 t1 H
                perror("open error");; o2 z2 Y1 h9 B" W7 W$ Q. I
                return -1;( o9 p0 o5 @( K$ {4 h% }
        }* d  `& F; _% p) z; d
        
7 g: u' ]$ L3 e9 a" @4 r        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);: o  S+ D! S2 i0 x9 J

) z) }# u! s7 \9 {        while(1)
9 G" i. E" U' x# K- D, Y        {& K( }6 k+ k' |
                read_MSG_buffer(mem);
* l( c4 J6 c" z- {2 @$ ^% i        }                ' m! P) y4 v3 H, [
}+ J6 [5 }* A0 w: {" {/ W  S
& r/ N7 M) v& y" u5 q
void read_MSG_buffer(int *baseaddr)
6 \4 A9 A# R* o4 |8 [1 d& t9 A{
, J* h& l$ u% I+ s$ G1 X% T, t        pRX_MSG_PROTOCOL pshreRAM = NULL;# [3 o- c( g( T9 U
. L5 H* ]0 Q2 V6 E, M, g" _5 a
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;; V% |9 P" j" v. \5 y2 ^$ v

& h4 j( I0 u8 J4 l, \2 }        if(pshreRAM->packet_cout != count_copy)
1 k" [8 a' @" |2 `) ~5 x+ f# w        {
! D6 ^* x: _3 R( W: L0 l( n                printf("a is %d\n", pshreRAM->a);2 `/ L( W& A8 G  m
                printf("b is %d\n", pshreRAM->b);8 O  V3 n3 f" p2 v% T1 x
                printf("count is %d\n", pshreRAM->packet_cout);
* e7 L' T  Y. N: @. M                count_copy = pshreRAM->packet_cout;
. m+ ^8 H0 u, e0 s  V6 S. f" ?        }
$ w7 c' t5 z+ r6 ]. w: E% h3 [2 a6 R        else: X+ |/ o9 L2 ~" [: E
        {
- U( R) V7 P/ c1 B0 J                printf("No effective message!\n");
8 b: Y+ W$ |) u$ r4 d( `' W2 O4 e        }
- t/ X/ s/ v3 V3 f4 g}
* D) B& M8 d3 q, v9 Y8 W8 D, d  o* r. b( v  [$ I/ l7 _' T
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???4 X# _% {- z/ q/ ?2 n2 t

0 H' b: s' s7 ?  {6 R1 E% p/ j1 _( B' a9 g; ^- O- }
7 q1 W( w- Q2 y* k

: J; k9 W, a1 K0 Q" _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-24 03:24 , Processed in 0.048919 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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