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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" s4 u. C( T0 R1 S8 f
( \# `2 h$ l2 l1 J3 ?OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>8 @( H) S* z7 o' P! e. F
#include <unistd.h>/ T( o7 R8 z4 l' p4 d6 j& @
#include <sys/mman.h>
& _% M4 G6 \) @! ~' \( x$ q7 l4 ^#include <sys/types.h>
, U: [0 w$ r4 [" K! E8 Y2 @#include <fcntl.h>1 e- o" b7 E0 V& z1 i$ v
) x2 c( Q- Z' i3 K! u0 x  G
#define SHAER_RAM_BASE_ADDR    (0x80000000)     I3 k. U. p' H  P& A- _
7 ~2 L/ [* G6 w) ?2 X; Z7 h7 T& v/ B
typedef struct# j/ @5 @$ n* ^
{7 |  ]& q* F  r' }, ?! X3 b
        unsigned int a;
' A% ^; m. I- R        unsigned int b;
; z3 y* r9 W9 }" ]4 M. t' ?7 w; `0 {        unsigned int packet_cout;
9 Y) \1 A9 U5 l. a7 H9 k. T% T}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: L" R! i5 n% b( ^3 b* y0 n4 g) V
9 z8 |4 x6 I  Rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 l9 j! T0 W9 h! `9 A7 Y* @' ]unsigned int count_copy = 0;. K# v% @! [5 A; i3 L  ^
! f+ i5 o/ Z% t: n8 Z6 _' z
0 }2 i, G; Q1 l  l1 N. |3 o+ X
int main()9 h" E: m4 D3 O, }8 K
{
$ U/ r; B1 c" b9 }* l        pRX_MSG_PROTOCOL pshreRAM = NULL;2 m, J( Z* A% e- g$ L) g
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;# \8 F2 r6 ?* u, @$ W- F1 J

2 W9 w, Q$ L& u7 l8 W" c        while(1), ]0 K2 v  S/ ^+ Q) n' p! ^5 D
        {( y0 @% v' `: m) q5 O) n
                read_MSG_buffer(pshreRAM);
1 {0 w/ X( O/ i, Z* G; @6 O- W        }               
* T' t5 q; P% C! U+ Y' k}
0 l% Y% _% N2 A# i  a0 g0 W$ Y4 ~5 ?3 Z1 K# B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 c# I( O* E/ }1 p, N" D9 g{
* d/ |/ k2 |2 l0 p: D        RX_MSG_PROTOCOL buf;) ~% u$ q* F$ e$ l
        / I6 k3 y4 j( H6 x0 y
        buf.a = pshreRAM->a;
* r+ k- m- S9 ~  O        buf.b = pshreRAM->b;/ l" ]( n. [3 d; s; F* {7 {5 _
        buf.packet_cout = pshreRAM->packet_cout;2 N" A2 i3 X- Q) S
        7 V! w0 U$ c9 b9 c) F
        if(buf.packet_cout != count_copy)  U; A3 F: l* t8 e/ n5 e! p
        {
$ Z5 }  t1 l4 {6 b                printf("a is %d\n", buf.a);( f7 [! r, b& |. [
                printf("b is %d\n", buf.b);9 p- ]2 S0 ^" A( I# S+ L
                printf("count is %d\n", buf.packet_cout);% }8 z" u( w$ r+ y
                count_copy = buf.packet_cout;
- _( F9 }; P' _) m3 `/ c  d        }, q& g2 {0 F4 e% i8 O! e( f
        else" h: Z$ t$ l: ?0 D, `: d) U/ q
        {
2 `- z! d3 _! v1 n                printf("No effective message!");& W( j8 E# M& I" ?
        }
2 z' H8 a: J" Q  j$ X}
" d& [" x( d- O2 W2 h" a
9 R& A) g6 f  U: e& T9 F8 Y" B
1 U$ E' R9 \5 x1 j但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。. X: w1 {% ^/ O5 o6 M
使用下面代码,对内存使用了mmap函数后:
2 H9 S. G" X2 E  w#include <stdio.h>; C7 w2 X6 V, j% o9 j3 G, J
#include <unistd.h>
8 H5 K+ ~7 w8 \" l+ v#include <sys/mman.h>8 ^  L2 D1 ]& }# \: I) S7 h
#include <sys/types.h>3 p$ @* f- [, G$ m
#include <fcntl.h>
' D5 M6 F7 [$ C: o! e! |( S6 r
) S% J* F" `, w  R#define SHAER_RAM_BASE_ADDR    (0x80000000)2 S% g# k+ C. [! U8 r; ]
#define SHAER_RAM_SIZE         (0x20000)   + M, _6 x0 l! M( A. n7 W# c) ^
% i2 M$ Y+ j7 W; a7 |) k
typedef struct* c) N' |! h2 @  z' R
{4 a8 p7 U5 o1 N1 @4 s% A; o
        unsigned int a;
9 [% K+ R1 y( m* `4 C        unsigned int b;
6 c/ c- @2 j/ O9 h1 Y        unsigned int packet_cout;8 j8 B% P* j& w+ ?$ t: Q! v0 A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ Y) w  O8 ?: R8 j
, V, N4 f6 p6 ?
void read_MSG_buffer(int *baseaddr);2 X" [4 U) V) P1 w2 R, \5 E
unsigned int count_copy = 0;
1 f% q4 e1 W9 Y' v$ m
: L7 @5 o2 f2 @1 Xint main()
9 c' c+ ]( M/ d+ Q{) l; |* S( \! {
        int fd;+ ?3 P  [0 J) h2 P8 H
        int *mem = NULL;
' L" f4 H$ K' O0 n3 W, t0 ~
, H( }( ?2 d0 o, a. n        if((fd = open("/dev/mem", O_RDWR)) <0)
8 R- W, t- ?7 o# N5 l7 M* M# Z        {# t9 z7 I! Z8 S# m# s2 L6 m1 S+ E  e- i
                perror("open error");
. W; p. q9 V$ W* |: N4 g  m                return -1;" Q3 H8 v( e4 I
        }9 F+ @7 i. c+ ]! j  e: k, ~
        6 i6 }1 v3 R  k
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- R2 c+ z, i4 v% U& p
: H% Q6 V% H/ F7 @4 Q. U# a
        while(1)
/ {9 Z+ M* _$ Q        {4 l- U6 @" R) f6 F, R# J
                read_MSG_buffer(mem);  C8 ~; L7 Q; e
        }                ' o( R: s, o4 y. D3 V! X' ]
}; }. ~% f3 I* r( [! ^

* k+ R) ~8 k' Dvoid read_MSG_buffer(int *baseaddr)
9 @; v# P) V% Y$ I7 {{$ e5 m. k, z- `& n' V1 D$ v! w
        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ I0 k* q6 z% R$ T+ X7 g# J0 ?% u+ o! ~; V: D) N
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# T5 o) w! E, y. Q% I
5 q8 w* E* ~6 S
        if(pshreRAM->packet_cout != count_copy)
6 S0 D( R: s4 H/ C        {
6 d* W' K; t3 W& f% i                printf("a is %d\n", pshreRAM->a);
4 l) f/ W# ~* ?! |$ ], z1 w& S                printf("b is %d\n", pshreRAM->b);7 V( W7 I: R5 Q
                printf("count is %d\n", pshreRAM->packet_cout);: G- S) M, ]$ `$ w" O
                count_copy = pshreRAM->packet_cout;
3 n5 X4 _# F8 i4 E* S- C' e        }
' `% y, S7 [# ~4 L0 b+ p        else
! M# G# N- S# Y& n1 w% Q- A' }        {
0 Q/ _5 D! L1 t& d                printf("No effective message!\n");
  \$ r) q$ m8 p* D. I, g        }
; A9 G8 r' k2 d& N  v3 i$ z}
4 I, I& z* X" B+ E9 d1 |. n, S1 u5 Q5 ~' s" b7 m
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
8 L3 z9 R) x: z$ ]7 P1 z; L+ E0 R, y! {8 f1 k
5 a# K: c& R( D! R$ D
  D: O1 \# _1 B( {0 g$ Q

7 P: g2 T/ I  e% y' t4 W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-2 21:50 , Processed in 0.052178 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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