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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
3 |6 P2 I# x) |& J5 K' ?& D5 B1 ?- E" a4 z. u
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ G: J) ^4 }2 e. n2 ~#include <unistd.h>
! [: Y" u1 V% L: Z8 n+ z+ O1 x#include <sys/mman.h>
# Z+ {! K$ _% T: F#include <sys/types.h>6 C( o& j* h) g* q% x- n
#include <fcntl.h>, y( S# N+ g$ {0 G! U
' L. a( ~1 N% B0 y
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
- e8 J- G) q6 Z0 d" {! A4 D! u( R" F  F5 X
typedef struct' z! C. g1 ?6 w) {
{
+ H5 y" T8 I" D  k! N) N! x5 _9 [        unsigned int a;6 \1 l0 i% O+ \* ^1 t
        unsigned int b;
9 N* P' P$ }+ h' S        unsigned int packet_cout;: O4 q. U, G  Q0 U# l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& \9 ~! b& S- {  B
4 M3 Z1 }% J( v, N% K* {3 B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);+ E" y) s. N/ v1 _+ S" D
unsigned int count_copy = 0;
' M  [9 e& V$ I/ N2 Q' C$ G0 {& B
/ {/ \6 a$ }5 a3 @1 t8 o2 k+ P/ r. o5 f) E3 _$ [. N* X
int main()$ U# C$ {3 e$ c9 k" M
{# ^- s8 a( P# r( K. z, |5 E
        pRX_MSG_PROTOCOL pshreRAM = NULL;  Y  ?: g5 ^9 o1 O
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 }9 U- a3 d* D+ |' \" p/ k) ?% _8 v; O, j3 M0 H
        while(1)- A$ C% G4 \( ]5 }% f) ^
        {
; T4 Z- o) a% X* Z# H4 y# C                read_MSG_buffer(pshreRAM);
6 j; A4 b- K$ o& P* `        }                & R$ x/ x6 @' D( ^1 L5 i8 T
}
/ H) r1 J# P7 C5 A- p' }% v6 U5 z, k4 V4 }4 i8 H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)4 E, h/ p0 s# s: U- U& ?# _# x
{
! \) Q9 l  V3 q, l4 |4 l        RX_MSG_PROTOCOL buf;
0 G( L8 Z$ G( a4 @        
* ~* X+ R6 y% [/ k2 q$ a        buf.a = pshreRAM->a;) R1 }  O( ~! c/ Q" I
        buf.b = pshreRAM->b;' F! P2 U6 x# `& m8 Y2 [( ]
        buf.packet_cout = pshreRAM->packet_cout;
# B8 R( `; L4 F" W5 M4 z        
, n0 J: `  d2 H) q0 q        if(buf.packet_cout != count_copy)
5 g. V1 p9 Z0 x9 u2 D9 f9 v        {
1 y2 R2 i% X1 C& E* Z$ S                printf("a is %d\n", buf.a);
& }. T$ N+ O, k! f1 V6 c                printf("b is %d\n", buf.b);0 u( u5 t" J* y9 Z2 c4 ?# }5 d* y. T
                printf("count is %d\n", buf.packet_cout);$ c  Q# u6 E7 H$ S) `
                count_copy = buf.packet_cout;/ a% M) a: z' j) w; T6 R
        }( w8 S5 w4 J( z, S& D. C1 D* H
        else
4 w2 T  I9 p( o( c+ t7 n        {+ a/ L- }" Z, \) _3 r) \& ]- W/ v
                printf("No effective message!");
2 |4 S+ Q! I. J  Q        }
( D7 ?  X. _- {}
$ N* j! D/ g2 K$ Q5 F+ b  n
. a- m* M* v0 J8 n* w/ \+ Q0 {6 Q
5 K# y( {! W# }2 X% p但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! b2 |1 x0 ~" C3 c. U0 r使用下面代码,对内存使用了mmap函数后:: h8 w" }0 ^; G7 S. \
#include <stdio.h># q6 f" [' H& T3 s' e+ o5 J+ L
#include <unistd.h>+ b& w7 m4 [2 n6 b; {9 {
#include <sys/mman.h>8 n0 Y8 [" K4 L
#include <sys/types.h>
% `' V. ?- [/ B# I7 c$ z#include <fcntl.h>/ @3 C; _- K) N7 S

: d( b3 V. L' o1 R1 ]#define SHAER_RAM_BASE_ADDR    (0x80000000)3 c+ a8 }( @& @+ s( G- _
#define SHAER_RAM_SIZE         (0x20000)   
9 z9 x7 T& ^! I
* o$ x9 F& z' q! xtypedef struct, c  J, ]5 D/ t& g  T% R' i
{  i/ P: v9 x: f! P3 F9 k
        unsigned int a;
' }  x( o2 Y% M* |2 ~9 j        unsigned int b;
6 K5 c) |+ v) T; o+ X2 @# }        unsigned int packet_cout;
& J( V6 W; P& D# O}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 R# t$ d+ r" T8 i

4 p0 k& B4 D. m6 @' Pvoid read_MSG_buffer(int *baseaddr);
3 e$ ]4 {' |2 C" s" munsigned int count_copy = 0;" J$ a) a( \& E8 n8 i' U8 }. Z

# |/ j% g3 p6 w4 [3 W$ B5 q! v) u1 V/ q3 Tint main()
* _: o5 X- L0 g+ K! {{
$ V# D% o2 T/ @1 l4 n7 B6 e" }        int fd;: }! Z6 S3 {! v& z1 S
        int *mem = NULL;
2 s' H. |- o- L
1 l7 O7 o; R1 i: h6 d6 {, s4 @        if((fd = open("/dev/mem", O_RDWR)) <0)
/ {/ Y1 w3 `; E( T2 ~$ O% m5 L! V        {: f1 h4 y/ h( L; Z4 O
                perror("open error");
2 b( h/ V3 P2 P# o$ i; T                return -1;
( p/ ]; J7 B2 y; W! ~7 {        }
! e4 ?* a( B2 X        4 R+ f) s- T- p* f. u$ }) d
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 @+ M! T1 P' ?, `4 R$ G/ `5 w0 M+ \5 l: \1 b2 w
        while(1)
6 N1 q' j4 y$ p! }; m# W; |; F* h2 O  v        {/ p1 l1 C! P$ E
                read_MSG_buffer(mem);; Q3 p/ K5 I+ s
        }                0 j% n* l# H* J$ T& e
}
( Q' L) n) D6 O1 H6 B, f( u1 S: K" N- o- D
void read_MSG_buffer(int *baseaddr)
5 O/ X' A8 @$ F/ P9 t{$ o" y* p7 V* l$ k7 L1 f4 a- T
        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 x( U. C& u: r5 y) Y! _8 I0 e4 }# s% y4 U2 p" o4 K- k) v- @1 y0 q
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
) g# b5 b+ s! T5 {/ Q% T  V, d+ M+ v' m  c0 l, w- G
        if(pshreRAM->packet_cout != count_copy)
# O# x& n# Y1 G( f4 S7 F7 A        {
4 A, \2 B) K; @6 L# W' `4 [                printf("a is %d\n", pshreRAM->a);0 n  l9 B5 J( \+ G; u6 Y- }3 F& a
                printf("b is %d\n", pshreRAM->b);( V  P2 h, ]" ^7 Z
                printf("count is %d\n", pshreRAM->packet_cout);
  U# p  U" |6 c$ ^  h                count_copy = pshreRAM->packet_cout;
4 K6 p* |" t8 q) M: N$ z        }7 o6 B5 H  X" e  Y: I& R; r7 z2 o
        else
0 l6 j4 w& b+ D. S3 r1 N6 b+ ]        {
9 m5 }) N' z" i( i                printf("No effective message!\n");9 v2 r' H1 h; F5 h" ?- x! k- \
        }$ O$ m  p5 M6 T# m
}
; z/ p4 Y, k. f2 x1 j. }5 y1 c% J6 f8 G: T
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 G/ z6 B/ B0 G: A
/ E+ m) p0 \4 J- O1 n2 J9 [: F' f9 t$ y) ^& W7 n- |
4 r" n8 J0 U( V- M: O  c+ L; t

1 [+ R* i8 Y! ?. h/ B
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-11 16:28 , Processed in 0.048352 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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