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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ! N' A, G' J( q! Q* B2 R

8 l4 S1 d4 T0 u; e4 f0 b( g1 AOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>0 @/ g5 D7 P5 s
#include <unistd.h>  d" v. H4 D$ J6 s1 f; f3 Y
#include <sys/mman.h>0 w$ {: p0 w" S" t; G, D
#include <sys/types.h>! X" U2 I& i# y" N- R5 }4 V
#include <fcntl.h>* K$ [* e. ~0 T6 {
5 l$ Q) H' [. h- o" [/ a
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ( G" v; @% `4 l9 J) z, S% G

: x. {! v6 H; Ttypedef struct
$ e, Z7 h0 a$ E{  _  F* k+ e1 [( X
        unsigned int a;
  F& q# Q& G, D+ L4 ~- ?% O        unsigned int b;
" @& m* k. N7 J" G! B        unsigned int packet_cout;5 Y0 N. ^7 p& ]7 r1 x
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 O) i& ~/ T6 D  E4 F2 h7 {3 N, a( U9 ?) f! r9 L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, G; j# Y. C/ e) F; E% ounsigned int count_copy = 0;
+ p+ V. N# d1 n9 K6 _6 H* n8 m
- K! _" W3 x" E$ S
( {% L. u, E/ X0 W; A' d4 o6 Iint main()
$ K) c) v$ R3 g2 S! h{
  u$ A; Z, o. q1 Y7 F3 G        pRX_MSG_PROTOCOL pshreRAM = NULL;
. H0 y. v" s5 |2 k8 {        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;, l* i+ Z# w5 S1 q6 }
0 e. n5 e' E2 O+ D+ m( k
        while(1)
# @2 q9 E" D' [        {
/ g8 m3 u2 x- k* Q1 Z- u( O                read_MSG_buffer(pshreRAM);5 r0 ~3 F: D" c" N+ u# \% y
        }               
; G; `* ?4 R  t}
; N7 r, R% ?  O* I5 l' ?# \  O& x& w- M1 E* V4 E
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
5 A: n; J$ g) x$ c* [{2 g0 S4 c- e- j* X! d  f) x, E
        RX_MSG_PROTOCOL buf;
; }7 V% j1 d% q/ T, N8 k- K, _7 y          z: @8 v5 T% D7 e+ A9 G" W* ?
        buf.a = pshreRAM->a;
: P( y! T* |7 Y& Z7 F* u/ P( ?        buf.b = pshreRAM->b;- A7 Z+ M1 [; J' U9 F' c, q
        buf.packet_cout = pshreRAM->packet_cout;. O# M% g: x8 D$ z$ t5 s4 r6 X
        
- i" Z: W7 F' q" \, D' L0 H        if(buf.packet_cout != count_copy)+ p; L  I- H- {1 Z8 q! e5 D8 Z
        {- o9 x! }+ G) s% F: s
                printf("a is %d\n", buf.a);% i/ e. c' \* C" o  M
                printf("b is %d\n", buf.b);
% ~% k( j% {+ ?6 ^! t                printf("count is %d\n", buf.packet_cout);
' F; h( Q2 y5 |5 F! r. c                count_copy = buf.packet_cout;
- C# H6 {# S3 a% i2 p        }
+ O# ^: g, U/ {        else! _: A# u3 s( K( z( G* Y' T8 E+ ]
        {
" M4 V3 q: D7 N; T! X0 j: Y3 N) p# s                printf("No effective message!");% U7 T- Y7 f9 f+ _" v& K) I. L
        }* Y% H' i# Y+ N1 S% a# N
}' s: h8 D- y6 J' i+ `- G

& O8 Y& A* H& U# ]* |7 q9 x$ X. y7 g
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。; m! S- a' W" ~
使用下面代码,对内存使用了mmap函数后:
' l/ t* q- Z; Z0 u, N0 m#include <stdio.h>7 L) u; j' k, K7 s9 B: N
#include <unistd.h>
: u1 A* l9 N6 j# y* X4 u#include <sys/mman.h>6 M( f- S* Z2 H& j0 i* ^
#include <sys/types.h>% D6 G: O+ [" ]9 m, a
#include <fcntl.h>
6 N3 O9 ]% y, e1 n
9 l+ ?" w" D; f' [9 k/ y) ^#define SHAER_RAM_BASE_ADDR    (0x80000000), ?6 l; r9 y# g% }
#define SHAER_RAM_SIZE         (0x20000)   
4 @: Y! ?7 x9 D* y+ p7 q; m* k5 g) P: E1 u" c
typedef struct- j$ Z( }: ]/ x5 K) ~  H
{
* b* U, H  h$ g- {        unsigned int a;
0 g# O; B! _9 N; }6 I" w8 T        unsigned int b;
; A/ H$ k8 l) f' b2 d' t        unsigned int packet_cout;
7 ]% Y2 A2 N4 k; u/ Z% T}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 |% L* U# r! p5 a) i) i9 x1 n  m! K4 g' h9 R0 m1 m7 R
void read_MSG_buffer(int *baseaddr);7 D  p& Z* k. B6 z
unsigned int count_copy = 0;2 E, z1 l6 o! s/ ?7 e. A* G
  [# |& {$ w: i2 ~& _
int main()
' X" j  `) e+ u8 Q4 t{
, e, f% Q+ L6 h* z+ ?        int fd;
8 M$ j7 I; P: C# m. |6 {9 K9 ~        int *mem = NULL;- d4 p0 P3 O# H1 I! E8 F$ i" M
+ ^: |; r+ t" K( D4 s
        if((fd = open("/dev/mem", O_RDWR)) <0): Z6 h' K  V: G
        {
9 J/ b$ }3 _% K1 z3 H                perror("open error");0 c& t7 x* d$ x( n
                return -1;. I0 j( K. r9 I- r3 V
        }
3 M, \& @6 Q2 s        
# m0 k6 o. B: ~, J        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- i  Q8 E2 A$ P6 q( B9 L% J* b  z1 U: Q5 G
        while(1)1 j7 {3 O/ ^8 G% ]
        {0 z$ F+ P* z* B8 k! E4 r7 D4 Q, M
                read_MSG_buffer(mem);8 e" @/ }2 |: s7 K
        }                , e$ U+ v( V4 v# ?. r% W- B6 _2 p8 `
}  v# @: r; e, @  q' ?( G) \8 R
; l# l4 c3 C  R; t( W6 M
void read_MSG_buffer(int *baseaddr)0 }6 Q+ t+ a" B
{" @- u& }& a2 I! p
        pRX_MSG_PROTOCOL pshreRAM = NULL;) @: x( S# k( e3 g) K$ w

8 c5 j4 S3 S3 Y3 ^- E  Z        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 D% z% ~9 Y4 ?; R, z8 \8 J+ i8 u& P9 L/ Q8 h
        if(pshreRAM->packet_cout != count_copy)
9 _$ K: d8 ?8 x- B        {+ q4 H) M) v$ I/ D( f$ @: l2 b7 {
                printf("a is %d\n", pshreRAM->a);( F/ t, P" `. S
                printf("b is %d\n", pshreRAM->b);+ H. Q# M6 B) k$ }+ E0 l/ O" L: V2 g
                printf("count is %d\n", pshreRAM->packet_cout);
5 s7 R  m9 d+ p* k: {                count_copy = pshreRAM->packet_cout;
+ g6 e4 n9 o6 {        }" \8 P/ x$ F7 S: L9 G( `  [3 _
        else3 M7 }0 c, G( q7 F( P# m5 t
        {6 F7 y% [& M! E$ u
                printf("No effective message!\n");  u* Q4 w! k& g$ |- Y' f  v
        }' k* k3 K/ ^% k: U0 p4 |, ~
}1 V  \6 B2 j& X8 J. i
, q' |: \: Z+ R2 W
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
4 w" i) H8 i. D
! v$ y# `( m9 y+ \( h9 D( W
* g0 \, W* p$ d+ m3 b. H$ ?+ X1 G8 E& S3 |: C7 n
" S1 I; }% Z9 Y5 K4 y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-15 08:46 , Processed in 0.040287 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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