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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
5 D, J" g" q6 D6 ~1 o
: o2 _. k# [* X% x1 COMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>' W1 d( o( i8 Q+ U
#include <unistd.h>
/ W5 |- f: B& |- j# }: a0 @#include <sys/mman.h>; G% ?* I  [" j1 r+ L; O
#include <sys/types.h>
! i6 d. Z4 ^+ ^& L#include <fcntl.h>
# r7 `) ]5 j% A8 E0 |
; m8 M1 N) K( b* D$ X7 h6 m#define SHAER_RAM_BASE_ADDR    (0x80000000)   
, D  K* x0 z. o4 K4 D1 Q
5 m9 }( l/ o) ^3 E$ ztypedef struct
4 L9 b! [0 k$ N3 [, k{
8 X8 |# J8 C- P2 _. K; Z' N        unsigned int a;
- Z) _7 s  Y2 ^0 _; @& G        unsigned int b;+ }3 S+ j# `" ^. e  s+ l
        unsigned int packet_cout;( T) {6 S* {6 a6 H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 c' v& R- N& m" }+ A

- C5 f& M7 t; L  ~void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
; |/ Y* v( c% K% K6 g/ a/ V5 dunsigned int count_copy = 0;
# J0 b$ f; W6 }1 j$ C7 i1 N3 X$ U

! A/ U8 }' E) S4 x' X' P" r" vint main()
+ B( L' V- L2 v2 h% ?0 ]{% l- h. ?3 x3 O! P6 z
        pRX_MSG_PROTOCOL pshreRAM = NULL;9 N6 x! k9 j" z/ r( A
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 w& u+ f) L0 m4 M0 ~# |9 i8 y5 z
        while(1)7 Z. k0 j/ C6 s5 B; q. ^
        {& j4 h- O: o- g
                read_MSG_buffer(pshreRAM);# ?& D. E6 p' m6 p) K1 J; |
        }               
) A0 ~$ ~3 v" T) k: d& x}
8 s$ Z7 r! e0 G+ M
. Q; e  Z& i: i8 g2 M* e$ ~void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)& s( r" Z6 a  K7 K, N
{0 t7 K9 ]' ^5 _8 J' N3 H/ _
        RX_MSG_PROTOCOL buf;2 j  b+ x3 y. [/ }+ {- J
        6 G+ M* Q& U" ~: Z* S( i
        buf.a = pshreRAM->a;
* ?( l1 f$ b) |. e/ {        buf.b = pshreRAM->b;
  f& f" Y  i1 U  I& ~% u        buf.packet_cout = pshreRAM->packet_cout;
& z! h) _. k' a% p3 s        ! y2 H  a' b9 y
        if(buf.packet_cout != count_copy)% C' l) {0 m+ y
        {
0 G: j: l5 i- z6 ]/ Y; g                printf("a is %d\n", buf.a);( t3 v2 f: N  O3 ?. \! o
                printf("b is %d\n", buf.b);
, v; ~) m6 t& R9 \2 L* R                printf("count is %d\n", buf.packet_cout);
9 j/ ?( ~9 K. C  r2 I: _; o                count_copy = buf.packet_cout;
$ y) ?3 P( }% w' B- q( n  }+ U4 J        }
/ f' F! t2 ^' z! ]' K% m9 l' j        else
2 N, n2 `' h( ]        {, E. U% I% J7 S  `2 k$ R+ t
                printf("No effective message!");
+ W6 H- G* b' G7 f        }
! W& i( Z2 v, x. V4 P. W& h}, }! S' Y# M0 D2 y7 `6 _
1 @$ ?1 E) B* M+ A9 S

, v: a1 z1 ]0 ?6 c但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
+ h0 X: r7 |" o- I* `! q使用下面代码,对内存使用了mmap函数后:
/ G1 f; L6 a" ~5 }: L' K% W" \#include <stdio.h>
5 ]( x$ ^3 l  ]/ ~$ N! Q6 U7 y#include <unistd.h>
; U# `. |' n& @  C) _* e. B#include <sys/mman.h>
& K/ L7 P7 l! B+ h2 {#include <sys/types.h>! }; M" I+ x" [4 ^  \) B# [
#include <fcntl.h>4 `" T; T* h) Q+ }

: U$ o# l( H4 G* k6 t#define SHAER_RAM_BASE_ADDR    (0x80000000)4 a8 A# G& [0 J9 z
#define SHAER_RAM_SIZE         (0x20000)   
' _# H8 ^5 a% F3 x" i
" o  N7 f$ }% F6 y0 k  Rtypedef struct8 ~, p0 G/ ?$ {3 S/ L& X& d
{
7 z8 ?0 T( {0 p! V, h% z4 v) B        unsigned int a;
# e6 x6 P) g- ?: j        unsigned int b;/ |# x% G+ a# i: |, }4 _/ Q; _: p
        unsigned int packet_cout;
, e$ N  g  S" R: z4 K" R& x( O7 S, N2 C}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 [$ E2 b) F( N' O& v8 I
/ F, V7 ]3 K# y) f3 J
void read_MSG_buffer(int *baseaddr);
; ~( @, a: W: v0 runsigned int count_copy = 0;
( }8 u7 O! h  D/ @4 ~! I+ l  p- ?& J5 I
int main()1 b1 T: C# E& w+ f% J0 V7 z
{6 z5 a7 F3 |0 N; a' `' W
        int fd;% M0 ]" U* D2 D% R
        int *mem = NULL;
0 j' C6 L4 m3 v, u
5 y0 d6 S$ @& h; ^! m' h8 T8 a        if((fd = open("/dev/mem", O_RDWR)) <0)' p. g# c, X7 }4 f& [; u
        {
# `* G. j$ g8 R5 ?& U                perror("open error");
* K7 ]% a. h4 x                return -1;1 K4 j5 x) f/ _* v. J% v
        }3 u/ L5 t$ l9 _
        
0 L% U" }, q4 ]( [, e% F        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);1 G: R: u2 n" T- A$ }7 }

; Z9 n& p; Q! E( Q; {        while(1)
% L$ |5 S) g& o7 K2 T& u        {1 v1 x/ g" e. K, I/ H; C
                read_MSG_buffer(mem);4 _6 u3 O7 f+ x
        }                1 `% }, i" `" [4 F# T4 R0 y
}; n  Y5 s/ k& u# n4 i" W: T( C
' X$ x0 ^+ N/ J, g8 L6 S" T
void read_MSG_buffer(int *baseaddr)( F% N8 `9 o2 g. N& S* v
{. i8 r1 X. G3 \, {8 N  q
        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 R' k6 _  V" K5 k/ w& S0 ?
0 b( S$ K% U, c/ }! G5 t) }) G        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;$ v4 m. a: D/ S  h3 E
4 b1 c- i% [$ e
        if(pshreRAM->packet_cout != count_copy)
- z5 H2 d, J; |# y! e$ \( u# P( c        {
9 ]9 Q$ O/ T( A& s) r, V* Y* z                printf("a is %d\n", pshreRAM->a);
+ `7 `) k2 H) w7 q                printf("b is %d\n", pshreRAM->b);
; W6 r% K! p" c, P                printf("count is %d\n", pshreRAM->packet_cout);0 D% N7 \4 U% V! t7 n5 c5 D
                count_copy = pshreRAM->packet_cout;! [( g! ?. s+ d' B% M! F
        }* x0 g2 }8 S3 k! s2 }0 D
        else
3 a  B/ g7 R7 a5 C8 o' a! ]  x        {; p' a$ y: E( r2 z* E  ~
                printf("No effective message!\n");
1 ^+ O; c  s( v4 O5 d        }
# A  a$ x; d& t+ `3 |! V4 ?8 B}4 b1 C$ e6 G: R" t4 ^( V, b8 e( K
4 l% b0 U: }7 c
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& k0 j( O8 `; ?( H" ^+ t$ R3 Q9 ^0 {4 i$ o* z" S6 R
6 v0 {" Q& u$ c! ]3 L3 ^

0 w' n! X! p& O. x' v8 e& R' I4 d7 d: b' ?( G* L# {
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-19 16:03 , Processed in 0.040416 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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