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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" A9 N7 K5 W- x, Z; Q4 u2 X1 Y" m3 q" L/ e/ g( a2 \
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* ]2 D8 b; i5 b3 `  ]) Y; Z. I#include <unistd.h>
/ u. N+ W2 M9 a$ B/ _  Z#include <sys/mman.h>
* C( J) o3 s8 t: W* z#include <sys/types.h>
* y3 F# X- F: m: D#include <fcntl.h>  b: @6 B6 C' t) q9 h
' t9 Z& ^8 e; L$ Y" ?9 c
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ! Q  {8 C0 x" ~& _- N# f
0 d0 p9 l9 l7 f& H! T0 {+ o7 [
typedef struct
' O; G1 i1 \( Y' }5 ~5 J- ?{8 ~  @0 \0 h( l$ M' M- M* e
        unsigned int a;
0 c$ L2 w  c3 q, E# Y        unsigned int b;- h+ n; E( p% k, G! A" A! {3 i
        unsigned int packet_cout;
; R5 d2 F7 |/ j}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. Q. e: ^  W: @  e* _) Y

4 ?$ t/ _$ a9 N0 ^& \void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: O! \% r- F; J) vunsigned int count_copy = 0;
; O; I$ o/ A4 ^! N3 C$ E
( V) b! \1 E" d# M) Y1 t. F# v) f3 y% S5 J* l1 O
int main()
- P4 D6 u3 X  A  ^3 g) _{
2 P( H+ `4 W' S( I6 v! S        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 W% v0 O' a; I  P( ^        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;* |$ P5 F  F3 O! K3 F( s& b
" y* Z+ F& L' E8 d
        while(1)9 o4 W# e  I/ s% |" }* y' d
        {
( v. w) y! W8 M9 G$ o2 _" d                read_MSG_buffer(pshreRAM);
6 d" t) p6 _; x        }               
* p0 _- }8 S4 L9 }5 G}% g& d) D! w/ d! ^3 ]5 a9 X# X
7 U: g& l  S7 G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, u! @0 |8 j* T: Z9 l: C$ O{
! ^# h- o  \! Z/ m1 |        RX_MSG_PROTOCOL buf;' P. o: w; K1 e# Z
        
/ I9 N& Y/ U3 d$ g; n4 v        buf.a = pshreRAM->a;7 N" Y; f. k7 v8 {% `1 n4 F$ |
        buf.b = pshreRAM->b;" [4 f/ v: U: N5 G8 _- e: ^
        buf.packet_cout = pshreRAM->packet_cout;2 a5 m7 e0 ?# i2 A
        ( H: q, ]: C) V7 x8 s
        if(buf.packet_cout != count_copy)
  ]7 J  o# e/ f0 d) z9 [        {
) ^* e* r5 S' u4 D' L0 U$ n                printf("a is %d\n", buf.a);9 Q! G' \* m" L; M9 }' Y! Q
                printf("b is %d\n", buf.b);) O1 A' A' [/ N% F* \3 t/ r
                printf("count is %d\n", buf.packet_cout);
3 k  K! g7 }" m$ y. m                count_copy = buf.packet_cout;; D1 w0 M5 p, B( U$ l" U
        }; p; y0 z! @3 ?1 o% ^, b  o4 r
        else( Z+ U- K& y8 b2 H) g7 C6 c
        {
7 k: s  j+ c6 P3 @' i. x" H                printf("No effective message!");: u. J( l/ N& h
        }: E; r9 Z, Q& f3 ~2 N
}
* A% ^7 a7 \) d$ Q. f1 I' A+ c' D+ M# @' O
0 P, E- b; U* N( p
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 S3 h' j0 o* [使用下面代码,对内存使用了mmap函数后:
3 B) q5 }! Z( C4 M. _& h#include <stdio.h>1 o0 D6 b6 a) r5 I( D; @/ `3 D: F
#include <unistd.h>) E6 D4 l- R# X, q
#include <sys/mman.h>) e0 p  }5 r% R8 T5 }) b5 M' ^/ h/ C
#include <sys/types.h>
2 D) m0 b( ~) f#include <fcntl.h>* C; s. S3 K+ l1 F: V& B9 G

+ _% x: _  D7 T9 l% l3 Z# E0 [#define SHAER_RAM_BASE_ADDR    (0x80000000)
' F% a; Y. }( P0 M" Y7 h#define SHAER_RAM_SIZE         (0x20000)   # ]! g+ K' i. e) x$ G; f
. r  e9 v& r2 |" R. _! e& k* }# D
typedef struct
: z4 `; G. G  X- B) D9 I{+ }, [/ Q) ?9 q8 d6 v; {( T4 D
        unsigned int a;# [1 m' s" |6 E- h/ z
        unsigned int b;7 g3 @0 S5 n1 w, |: ?
        unsigned int packet_cout;
( T6 p, W9 g6 t; o: y6 H1 U1 _6 P}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 b+ Q4 S  D, H: e1 E$ C3 o0 @3 D! h: A3 [
void read_MSG_buffer(int *baseaddr);9 F( Q) V) I6 c" Y& G
unsigned int count_copy = 0;
* Y& n- ]- j- i7 S: d
% r4 o" C! D0 F1 e0 Bint main()
1 u) R9 e0 D" V7 w- H  l{! A% S0 M- M  [+ y. ?
        int fd;6 A( i& l0 c; c# b2 F( t
        int *mem = NULL;7 |/ a+ w* W; \, m! I1 G* n4 Q
0 B' z' {0 M; [1 b8 e1 G
        if((fd = open("/dev/mem", O_RDWR)) <0)
% \; u0 C& y7 e+ n+ x        {- N5 ?' _9 ]7 y! S- l
                perror("open error");
5 D" U1 m9 `7 x/ ~  Z0 V3 U, S                return -1;
3 O6 w3 y. |9 ]$ c        }* _/ D1 K5 }& _( U; Y
        
6 `  t, m8 M, o1 ?        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 N+ k  O: d/ l" l3 H2 x: A8 m
! j, ?% H0 l7 e9 s        while(1): }2 @* C& b7 T; u9 v
        {$ F& W/ m+ g7 Z4 ^) u$ b: R
                read_MSG_buffer(mem);* J% t( ]2 ~0 }5 k& z, S* ]* J
        }                5 ]6 I& F# P! Z7 A3 \
}: m' c0 e' v# w  u& B
, {& z1 f1 p  o+ G( g$ r' t. P
void read_MSG_buffer(int *baseaddr)# ~0 L) c4 m1 c* c9 L. b8 L7 G
{1 l1 }9 d0 ~  W0 }4 y3 H6 u5 _1 _4 u
        pRX_MSG_PROTOCOL pshreRAM = NULL;
  M2 M7 h+ i2 w; ^; F% t, i# v% I. r4 B& ?% X; H
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;  O$ L  L3 @* N' @. ^! B% a5 ?

6 [: p2 r7 p. O/ h' i+ d        if(pshreRAM->packet_cout != count_copy)7 C! j( A+ i3 _: t$ }: d7 h
        {
$ n& n. t+ s5 t5 F                printf("a is %d\n", pshreRAM->a);) O/ m- o& i. J! f
                printf("b is %d\n", pshreRAM->b);
, G9 c$ i% E  ]2 W; G7 b                printf("count is %d\n", pshreRAM->packet_cout);
2 S9 |" `/ G- @  [( J                count_copy = pshreRAM->packet_cout;
% |# I2 a9 u# L1 `        }
, r! [: K3 I7 W3 _        else
; f5 ]  I, a( M5 }& A        {
5 T& f% G( R5 M, Z* \4 k# I                printf("No effective message!\n");6 I7 y3 r# Q* N4 O
        }/ t7 t3 B- o$ `& d2 y; c- h
}5 M  q3 C' y- ?* u/ t* T

$ v4 p+ N9 g# J5 ?2 l1 u没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???' {0 E. k+ ^* W; ?& e) l7 U1 O

5 `3 W: c8 h8 H( o- K* L* s/ }3 I* f9 A2 _% w. r3 e" z" U9 x8 v
4 {  r& i# t. j0 F* E/ j7 R

* Y3 n" S6 i2 B7 Y$ L1 y6 r7 _8 {  g3 Y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-3 13:03 , Processed in 0.042569 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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